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

NHibernate以我无法控制的行为加载代理对象,nhibernate,Nhibernate,我有一个类图,看起来像上面的图片。我使用NHibernate对对象执行CRUD命令。当我写入权限表时(向用户的角色集合添加角色,反之亦然),NHibernate开始表现出奇怪的行为。 我有一个名为UpdateRoles()的方法,可以确保所有角色都是最新的。此方法失败,因为NHibernate有时会生成代理对象,因此UpdateRoles()现在认为该角色不存在,并生成一个新对象(导致复制我的层次结构)。 我找到了NHibernate将对象作为代理加载的模式: 案例1有效,案例2无效。 在案例

我有一个类图,看起来像上面的图片。我使用NHibernate对对象执行CRUD命令。当我写入权限表时(向用户的角色集合添加角色,反之亦然),NHibernate开始表现出奇怪的行为。 我有一个名为UpdateRoles()的方法,可以确保所有角色都是最新的。此方法失败,因为NHibernate有时会生成代理对象,因此UpdateRoles()现在认为该角色不存在,并生成一个新对象(导致复制我的层次结构)。 我找到了NHibernate将对象作为代理加载的模式:

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

在案例2中,用户仅添加到层次结构中的最后一级。现在,父角色(uCommerce)作为代理对象加载。 我的角色地图如下所示:

References(x => x.ParentRole).Nullable().Column("ParentRoleId");                    
HasManyToMany(x => x.Users).AsSet().Table("uCommerce_Permission");          
HasMany(x => x.Roles).Inverse().KeyColumn("ParentRoleId").Cascade.AllDeleteOrphan();
HasManyToMany(x => x.Roles).AsSet().Table("uCommerce_Permission");    
我的用户地图如下所示:

References(x => x.ParentRole).Nullable().Column("ParentRoleId");                    
HasManyToMany(x => x.Users).AsSet().Table("uCommerce_Permission");          
HasMany(x => x.Roles).Inverse().KeyColumn("ParentRoleId").Cascade.AllDeleteOrphan();
HasManyToMany(x => x.Roles).AsSet().Table("uCommerce_Permission");    
我如何防止NHibernate这样做? 我使用Fluennt NHibernate。 指定Not().LazyLoad()并不能防止此问题。我还了解到,指定这样的值是一种糟糕的编程方式。

1)

或2)

或3)

1) 2)基本相同,父母不懒


3) 这意味着每个角色都知道其父角色的类型,因此在创建代理时,它是实际角色类型(
CreateProductRoleProxy
)的代理,而不是
RoleProxy

UpdateRoles方法的代码。UpdateRoles方法非常庞大。但是它根据parentrole和type:typeof(CreateProductRole)==x.GetType()在DB中搜索对象。这导致它认为不存在对象,因为该类型不是CreateProductRole,而是代理类型。希望这能澄清一点。当你开始要求某种类型的东西时,你的设计通常会有问题。您可以始终查询当前角色为子角色的CreateProductRole。问题是每个角色都有0..*childs,而了解差异的唯一方法是使用鉴别器值(基本上与GetType()相同)。这就是我使用GetType的原因。
ReferencesAny(x => x.ParentRole)
    .Nullable()
    .EntityIdentifierColumn("ParentRoleId")
    .EntityTypeColumn("parentdiscriminator");

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