nHibernate - 自定义PrimitiveType的映射包

时间:2013-04-11 13:26:04

标签: .net nhibernate nhibernate-mapping

我在我的域中使用自定义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列表结束。关于正在发生的事情,有两件事让我感到震惊:

  • 如果我在EnumerationType.Get()中放置断点,则在检索ApplicationRole时调用该方法,但在访问ApplicationRoles时从不调用该方法,如nHibernate忽略我的Type()定义。
  • 生成的SQL似乎忽略了我指定的Column():

    SELECT UserFk FROM UserApplicationRole WHERE UserFk=@p0

我的映射看起来很像this question中的映射但是不起作用。由于nHibernate似乎忽略了映射的一半,因此我认为我做错了。

0 个答案:

没有答案