【问题标题】:Fluent NHibernate - How to map a List<enum>?Fluent NHibernate - 如何映射 List<enum>?
【发布时间】:2011-07-14 03:06:56
【问题描述】:

我有一个类,里面有一个字符串和一个枚举数列表。

public enum SomeEnum
{
    Undefined=0,
    Enum1,
    Enum2,
    Enum3,
    End
}
public class SomeObject
{
    public virtual int ID{get; set;}
    public virtual String Name {get; set;}
    public virtual IList<SomeEnum> EnumList {get; set;}
}

现在,应该有一个 SomeObjects 列表,其中包含 ID 和名称。应该还有这样的地图:

5 2
5 3
3 1
9 3

意思是,一个ID为5的玩家有Enum2和Enum3,另一个ID为3的玩家有Enum1,一个ID为9的玩家有Enum3。 他们说可以映射 int、float 等,但我不想从我的列表中创建 IList。

有没有一种简单的方法可以让流利的 nhibernate 做到这一点?

HasMany(x => x.EnumList )
    .Cascade.All()
    .Table("ObjectEnumTable");

此映射文件引发异常并显示“关联引用未映射的类:SomeEnum”。

提前致谢。

【问题讨论】:

    标签: .net nhibernate fluent


    【解决方案1】:

    您最好将枚举值列表存储为直接标志枚举值,但如果您绝对必须有一个枚举列表(您需要支持重复或遗留数据库),那么您的映射应该如下所示:

    HasMany(x => x.EnumList )
        .Cascade.All()
        .Table("ObjectEnumTable")
        .Element("EnumValueColumn");
    

    关键是任何非实体 HasMany 关系必须具有的 .Element() 方法,包括字符串、整数等。这将为您提供引用父实体的 ID 列,以及带有枚举的 EnumValueColumn 列每个项目的价值。

    【讨论】:

    • 谢谢,正是我想要的。
    • 在稍微不同的场景中,我还必须指定 .KeyColumn("")
    【解决方案2】:

    问题不在于您尝试保留 Enum,尽管如果您指定基本类型会有所帮助。 问题是您尝试存储一个列表(这成为 NHibernate 中的一对多关联)。列表中的项目必须是对象,以便 NHibernate 可以将它们映射到表。 是否可以选择仅使用 Id 和您的 Enum 值创建对象?这将允许 NHibernate 持久化它。 或者,如果您担心性能下降,请创建可以将完整列表存储为字符串的 getter 和 setter 逻辑。

    public class SomeObject
    {
        public virtual int Id { get; set; }
        public virtual String Name { get; set; }
        public virtual IList<SomeEnumClass> EnumList { get { return enumList; } set     { enumList = value; } }
        private IList<SomeEnumClass> enumList = new List<SomeEnumClass>();
    }
    
    public enum SomeEnum : int
    {
        Undefined = 0,
        Enum1,
        Enum2,
        Enum3,
        End
    }
    
    
    public class SomeEnumClass
    {
        public virtual int Id { get; set; }
        public virtual SomeEnum Value {get; set;}
    }
    

    你也可以看看:Map List<Int32> using Fluent Nhibernate

    【讨论】:

    • “或者,如果您担心性能下降,请创建可以将完整列表存储为字符串的 getter 和 setter 逻辑”我想这会导致更大的性能下降。
    • 没有命中会小得多,我假设您的数据库驻留在磁盘上,任何磁盘访问都比主内存中的一些简单字符串拆分花费更多时间。将枚举包装在一个类中,我试过了
    猜你喜欢
    • 1970-01-01
    • 2010-12-09
    • 2011-04-10
    • 1970-01-01
    • 1970-01-01
    • 2011-06-18
    • 1970-01-01
    • 2012-04-03
    • 1970-01-01
    相关资源
    最近更新 更多