NHibernate IsLoaded 和 Load 用于子集合,如在实体框架中
本文关键字:实体 框架 子集合 IsLoaded Load 用于 NHibernate | 更新日期: 2023-09-27 18:30:16
我正忙着调整Microsoft.AspNet.Identity.EntityFramework
项目,改为将NHibernate用于ORM。这相当容易,为NH没有内置异步的各种EF方法添加了许多更改async
变体。
到目前为止,我最关心的是这个(大量删节的)DbAspNetUsers
类的以下代码:
public partial class DbAspNetUsers : IDomainEntity<String>
{
...
public virtual IList<DbAspNetUserClaims> AspNetUserClaimsList{ get; set; }
...
}
现在,在其他地方,在原始 EF UserStore
类中(因此存在一些名称差异),并且对于不仅仅是声明的更多属性,我们有如下所示的代码:
private async Task EnsureClaimsLoaded(TUser user)
{
if (!Context.Entry(user).Collection(u => u.Claims).IsLoaded)
{
var userId = user.Id;
await _userClaims.Where(uc => uc.UserId.Equals(userId)).LoadAsync().WithCurrentCulture();
Context.Entry(user).Collection(u => u.Claims).IsLoaded = true;
}
}
声明的 NH XML 映射如下所示:
<class name="DbAspNetUsers, Core.Data" table="AspNetUsers" lazy='true'>
...
<bag name="AspNetUserClaimsList" inverse="true" cascade="all" lazy='true'>
<key column="UserId" />
<one-to-many class="DbAspNetUserClaims, Core.Data" />
</bag>
...
</class>
NHibernate是否有任何功能来涵盖此类方案,或者我应该简单地编写执行EF LoadAsync
工作的方法,然后设置一个Loaded
标志,为每个子集合重复?
如果可以的话,任何关于如何在 NH 中处理此问题的建议、命令或只是建议将不胜感激,因为甚至令人信服地被告知我不能这样做,必须根据需要简单地加载每个实体。
请原谅糟糕的命名。我正在为办公室使用"官方"映射生成器。
NHibernateUtil.IsInitialized(user.Claims)
会让你知道你的惰性集合是否已加载。
至于实际加载它们,您可以执行NHibernateUtil.Initialize()
或干脆开始使用集合(例如,调用user.Claims.Count()
会导致 NH 为您获取集合)