gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 11:33:55 25 4
gpt4 key购买 nike

My schema

我有一个类似于上图的类图。我使用 NHibernate 对对象执行 CRUD 命令。当我写入权限表(向用户的角色集合添加角色,反之亦然)时,NHibernate 开始表现得很奇怪。
我有一个名为 UpdateRoles() 的方法,可确保所有角色都是最新的。此方法失败,因为 NHibernate 有时会生成代理对象,因此 UpdateRoles() 现在认为 Role 不存在并创建一个新对象(导致我的层次结构重复)。
我找到了 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 这样做?
我使用流利的 NHibernate。
指定 Not().LazyLoad() 并不能防止这个问题。我还读到,指定这样的编程是一个糟糕的案例。

最佳答案

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

关于NHibernate 以我无法控制的行为加载代理对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8254348/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com