是否可以使用FluentNHibernate将具有空格的varchar映射到枚举

时间:2012-11-19 13:53:52

标签: c# nhibernate fluent-nhibernate fluent-nhibernate-mapping

标题要求一切。在数据库中,我有遗留数据,其中包含具有空格的文档标题,例如“标题持有者”等。我希望能够将这些直接映射到具有Fluent NHibernate的枚举,但我遇到了解析错误。我一直无法找到任何我可以使用的自定义转换器的指示,有人可以提出任何建议吗?

我的映射看起来像这样。

Map(x => x.DocumentName).Nullable().CustomSqlType("varchar(50)");

2 个答案:

答案 0 :(得分:2)

您将需要实现自己的NHibernate IUserType,并且您的大部分逻辑将在NullSafeGet()和NullSafeSet()方法中。

您还需要创建自己的内部枚举到字符串映射。您可以使用将字符串作为键并将枚举值作为值的字典,因此您的逻辑基本上围绕查找该字典中的值以从字符串转换为枚举,反之亦然。另一种选择可能是使用一个属性来装饰每个枚举值及其名称的字符串版本,然后在运行时使用反射进行转换......

以下是创建自定义IUserType的一些示例:(下面的第一个链接应该指向正确的方向)

答案 1 :(得分:1)

可以编写一个自定义类型,在从数据库中读取数据时删除空格,然后可以将转换后的字符串映射到枚举。这种方法的问题在于将数据保存回数据库,因为您不知道将空间添加到何处(除非您对意大利面条代码感到满意,以便跟踪将空格插回的位置)。

或者,您可以在类型为enum的类上具有一个附加属性,该属性根据映射到数据库的属性中的内容返回枚举。以下示例

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
}