【问题标题】:Is it possible to map a varchar that has spaces to an enum with FluentNHibernate是否可以使用 FluentNHibernate 将具有空格的 varchar 映射到枚举
【发布时间】:2012-11-19 13:53:51
【问题描述】:

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

我的映射如下所示。

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • 根据数据,您可以在 IUserType 中将空格换成下划线
    【解决方案2】:

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

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

    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
    }
    

    【讨论】:

      猜你喜欢
      • 2012-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-04
      • 1970-01-01
      • 1970-01-01
      • 2019-08-14
      • 1970-01-01
      相关资源
      最近更新 更多