这是我的解决方法(这是一种解决方法;我正在处理一个 IMO 设计不佳的就地数据库)。
原文出自:https ://forum.hibernate.org/viewtopic.php?f=25&t=979685&view=previous
这是我的自定义字符串类(在 VB 中):
Imports NHibernate.UserTypes
Imports NHibernate.Type
Imports NHibernate.SqlTypes
Public Class CaseInsensitiveStringType
Inherits AbstractStringType
' Methods
Public Sub New()
MyBase.New(New StringSqlType)
End Sub
Public Sub New(ByVal sqlType As StringSqlType)
MyBase.New(sqlType)
End Sub
' Properties
Public Overrides ReadOnly Property Name As String
Get
Return "InsensitiveString"
End Get
End Property
Public Overrides Function IsEqual(ByVal x As Object, ByVal y As Object) As Boolean
Return MyBase.IsEqual(x, y) OrElse (x IsNot Nothing AndAlso y IsNot Nothing AndAlso String.Equals(x, y, StringComparison.InvariantCultureIgnoreCase))
End Function
Public Overrides Function GetHashCode(ByVal x As Object, ByVal entityMode As NHibernate.EntityMode, ByVal factory As NHibernate.Engine.ISessionFactoryImplementor) As Integer
Return MyBase.GetHashCode(x.ToString().Trim().ToUpperInvariant(), entityMode, factory)
End Function
End Class
而且我使用 FluentNhibernate,所以这是映射的样子(仅适用于 Id 字段):
Id(Function(x) x.Id).GeneratedBy.Assigned().CustomType(Of CaseInsensitiveStringType)()
就是这样;我的关联开始再次正确填充。
同样,使用 int/GUID PK 而不是字符串来正确设计数据库要好得多,但如果必须这样做,这是“修复”NHibernate 的一种不错的方式。