我在我的域中使用自定义enum like type,并使用EnumerationType(基于PrimitiveType)告诉nHibernate如何从DB值转换为我的类型。当我将它直接映射到对象上的单个属性时,这可以正常工作,但我无法将其映射到这些对象的列表。我的数据库看起来像:
User UserApplicationRole
----- --------------------
Id UserFk
ApplicationRoleFk ApplicationRoleFk
请注意,User.ApplicationRoleFk不应该在最终版本中(你可以拥有多个ApplicationRoles),但这是我唯一能够工作的东西,所以我将它包括在内以帮助完成这篇文章。我的域对象和映射看起来像:
public class User: Entity
{
public virtual ApplicationRole ApplicationRole { get; set; }
public virtual IList<ApplicationRole> ApplicationRoles { get; protected set; }
}
public class ApplicationRole : Enumeration
{
public static readonly ApplicationRole Admin = new ApplicationRole(1, "Admin");
public static readonly ApplicationRole MasterOfTheUniverse = new ApplicationRole(2, "MasterOfTheUniverse");
protected ApplicationRole() { }
protected ApplicationRole(int value, string displayName) : base(value, displayName) { }
}
mapper.Class<User>(map =>
{
map.Property(x => x.ApplicationRole,
p =>
{
p.Column("ApplicationRoleFk");
p.Type<EnumerationType<ApplicationRole>>();
});
map.Bag(x => x.ApplicationRoles,
cm =>
{
cm.Schema("Management");
cm.Table("UserApplicationRole");
cm.Key(k => k.Column("UserFk"));
cm.Cascade(Cascade.None);
},
cer =>
{
cer.Element(m =>
{
m.Column("ApplicationRoleFk");
m.Type<EnumerationType<ApplicationRole>>();
});
});
}
使用此设置,单个ApplicationRole属性完全有效,但列表无法正常工作。如果用户表中的UserApplicationRole中有两个条目,则该用户对象将以包含两个空值的ApplicationRoles列表结束。关于正在发生的事情,有两件事让我感到震惊:
生成的SQL似乎忽略了我指定的Column():
SELECT UserFk FROM UserApplicationRole WHERE UserFk=@p0
我的映射看起来很像this question中的映射但是不起作用。由于nHibernate似乎忽略了映射的一半,因此我认为我做错了。