我有一个类图,如上图所示。我使用NHibernate对对象执行CRUD命令。当我写入权限表(向用户的角色集添加一个角色,反之亦然)时,NHibernate开始表现得很奇怪。 我有一个名为UpdateRoles()的方法,可确保所有角色都是最新的。此方法失败,因为NHibernate有时会生成代理对象,因此UpdateRoles()现在认为角色不存在并创建一个新对象(导致我的层次结构被复制)。 我发现NHibernate将对象加载为代理时的模式:
案例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()不会阻止此问题。另外我读到指定这样的情况是编程的坏情况。
答案 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