2016-01-13 3 views
0

Я занят адаптацией проекта Microsoft.AspNet.Identity.EntityFramework вместо использования NHibernate для ORM. Это было довольно просто, с большим количеством изменений, добавив async вариантов для различных методов EF, где NH не имеет встроенного асинхронизма.NHibernate IsLoaded и Load для дочерних коллекций, как в Entity Framework

Мое самое большое беспокойство до сих пор с кодом, как следующий за этим (много сокращениями) 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, если я могу, были бы очень благодарны, так как даже убедительно сказали, что я не могу этого сделать и должен просто загружать каждую сущность по мере необходимости.

Извините за страшное именование. Я использую «официальный» генератор отображений для офиса.

+1

будет 'NHibernateUtil.IsInitialized (user.Claims)' делать ? Что касается загрузки ленивой коллекции, вы можете либо сделать NHibernateUtil.Initialize() ', либо просто начать использовать коллекцию (например, вызов' user.Claims.Count() 'приведет к тому, что NH выберет коллекцию для вас) – NPras

+0

Спасибо, @ NPras, я не знал «IsInitialized» и др., Но я уверен, что это то, что я ищу. Я проверю, и вы можете принять этот ответ, чтобы его приняли. – ProfK

+0

Не можете ли вы убедиться, что коллекция инициализируется при загрузке пользователей с активной загрузкой? Мне кажется громоздким напоминание о вызове EnsureCollectionXIsLoaded каждый раз, когда используется CollectionX. – Firo

ответ

0

NHibernateUtil.IsInitialized(user.Claims) даст вам представление, была ли загружена ваша ленивая коллекция.

А на самом деле их загрузке, вы можете либо сделать NHibernateUtil.Initialize() или просто начать использовать коллекцию (например, вызывая user.Claims.Count() вызовет NH принести коллекцию для вас)