NHibernate在我无法控制的行为中加载代理对象

时间:2011-11-24 08:56:14

标签: nhibernate

My schema

我有一个类图,如上图所示。我使用NHibernate对对象执行CRUD命令。当我写入权限表(向用户的角色集添加一个角色,反之亦然)时,NHibernate开始表现得很奇怪。 我有一个名为UpdateRoles()的方法,可确保所有角色都是最新的。此方法失败,因为NHibernate有时会生成代理对象,因此UpdateRoles()现在认为角色不存在并创建一个新对象(导致我的层次结构被复制)。 我发现NHibernate将对象加载为代理时的模式:

enter image description here

案例1有效,案例2没有。 发生的情况是,在案例1中,用户被添加到层次结构的每个3级中的每个角色的用户集合中。这是按预期工作的。

在案例2中,用户仅添加到层次结构中的最后一级。现在,父角色(uCommerce)作为代理对象加载。 我的RoleMap看起来像这样:

References(x => x.ParentRole).Nullable().Column("ParentRoleId");                    
HasManyToMany(x => x.Users).AsSet().Table("uCommerce_Permission");          
HasMany(x => x.Roles).Inverse().KeyColumn("ParentRoleId").Cascade.AllDeleteOrphan();

我的UserMap如下所示:

HasManyToMany(x => x.Roles).AsSet().Table("uCommerce_Permission");    

如何防止NHibernate这样做? 我使用Fluennt NHibernate。 指定Not()。LazyLoad()不会阻止此问题。另外我读到指定这样的情况是编程的坏情况。

1 个答案:

答案 0 :(得分:0)

1)

var proxy = parent as INHibernateProxy;
if (proxy != null)
{
    // var t = x.GetType(); becomes
    var t = proxy.HibernateLazyInitializer.GetImplementation().GetType();
}

或2)

References(x => x.ParentRole).Nullable().Column("ParentRoleId").Not.LazyLoad();

或3)

ReferencesAny(x => x.ParentRole)
    .Nullable()
    .EntityIdentifierColumn("ParentRoleId")
    .EntityTypeColumn("parentdiscriminator");

typeof(CreateProductRole).IsAssignableFrom(role.Parent.GetType()).

1)和2)基本相同,父级不是延迟加载的

3)表示每个角色都知道其父级的类型,以便在创建代理时,它是实际角色类型(CreateProductRoleProxy)的代理,而不是RoleProxy