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 中处理此问题的建议、命令或只是建议将不胜感激,因为甚至令人信服地被告知我不能这样做,必须根据需要简单地加载每个实体。

请原谅糟糕的命名。我正在为办公室使用"官方"映射生成器。

NHibernate IsLoaded 和 Load 用于子集合,如在实体框架中

NHibernateUtil.IsInitialized(user.Claims)会让你知道你的惰性集合是否已加载。

至于实际加载它们,您可以执行NHibernateUtil.Initialize()或干脆开始使用集合(例如,调用user.Claims.Count()会导致 NH 为您获取集合)