我正在忙于调整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;办公室的映射生成器。
答案 0 :(得分:0)
NHibernateUtil.IsInitialized(user.Claims)
会让您知道您的懒惰集合是否已加载。
至于实际加载它们,您可以NHibernateUtil.Initialize()
或者只是开始使用该集合(例如,调用user.Claims.Count()
将导致NH为您提取集合)