Fluent NHibernate - 如何映射List <enum>?</enum>

时间:2011-07-13 08:19:09

标签: .net nhibernate fluent

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

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和Name。应该有另一张这样的地图:

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”。

提前致谢。

2 个答案:

答案 0 :(得分:13)

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

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

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

答案 1 :(得分:1)

问题不在于您尝试保留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