我有一个类,里面有一个字符串和一个枚举器列表。
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”。
提前致谢。
答案 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;}
}