标题问了一切。在数据库中,我有遗留数据,其中包含带有空格的文档标题,例如“标题持有者”等。我希望能够使用 Fluent NHibernate 将这些直接映射到枚举,但我遇到了解析错误。我找不到任何可以使用的自定义转换器的迹象,有人可以提出任何建议吗?
我的映射看起来像这样。
Map(x => x.DocumentName).Nullable().CustomSqlType("varchar(50)");
标题问了一切。在数据库中,我有遗留数据,其中包含带有空格的文档标题,例如“标题持有者”等。我希望能够使用 Fluent NHibernate 将这些直接映射到枚举,但我遇到了解析错误。我找不到任何可以使用的自定义转换器的迹象,有人可以提出任何建议吗?
我的映射看起来像这样。
Map(x => x.DocumentName).Nullable().CustomSqlType("varchar(50)");
您将需要实现自己的 NHibernate IUserType,并且您的大部分逻辑将在 NullSafeGet() 和 NullSafeSet() 方法中。
您还需要创建自己的内部枚举到字符串映射。您可以使用将字符串作为键和枚举值作为值的字典,因此您的逻辑基本上将围绕在该字典中查找值以从字符串转换为枚举,反之亦然。另一种选择可能是使用一个属性来装饰你的每个枚举值与它的名称的字符串版本,然后在运行时使用反射进行转换......
以下是一些创建自定义 IUserType 的示例:(下面的第一个链接应该为您指明正确的方向)
可以编写一个自定义类型,在从数据库读取数据时消除空格,然后您可以将转换后的字符串映射到枚举。这种方法的问题在于将数据保存回数据库时,因为您不知道在哪里重新添加空间(除非您对意大利面条代码感到满意以跟踪在哪里插入空间)。
或者,您可以在枚举类型的类上添加一个附加属性,该属性根据映射到数据库的属性中的内容返回枚举。下面的例子
public class Document
{
public virtual string DocumentName {get; set;}
public EDocumentName Name
{
get
{
if (DocumentName == "Title Holder")
{
return EDocumentName.TitleHolder;
}
}
set
{
if(value == EDocumentName.TitleHolder)
{
DocumentName = "Title Holder";
}
}
}
}
public enum EDocumentName
{
TitleHoldder
}