NHibernate IsLoaded和Load用于子集合,例如Entity Framework

时间:2016-01-13 21:05:56

标签: c# entity-framework nhibernate nhibernate-mapping

我正在忙于调整Microsoft.AspNet.Identity.EntityFramework项目,而是将NHibernate用于ORM。它非常简单,为各种EF方法添加async变体进行了大量更改,其中NH没有内置异步。

到目前为止,我最关心的是使用以下代码进行此操作(很少删节)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中处理此问题的建议,命令或建议,如果我能够非常感激,甚至可以令人信服地告诉我不能这样做,并且必须根据需要简单地加载每个实体。

请原谅可怕的命名。我正在使用官方&#39;办公室的映射生成器。

1 个答案:

答案 0 :(得分:0)

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

至于实际加载它们,您可以NHibernateUtil.Initialize()或者只是开始使用该集合(例如,调用user.Claims.Count()将导致NH为您提取集合)