Я занят адаптацией проекта 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, если я могу, были бы очень благодарны, так как даже убедительно сказали, что я не могу этого сделать и должен просто загружать каждую сущность по мере необходимости.
Извините за страшное именование. Я использую «официальный» генератор отображений для офиса.
будет 'NHibernateUtil.IsInitialized (user.Claims)' делать ? Что касается загрузки ленивой коллекции, вы можете либо сделать NHibernateUtil.Initialize() ', либо просто начать использовать коллекцию (например, вызов' user.Claims.Count() 'приведет к тому, что NH выберет коллекцию для вас) – NPras
Спасибо, @ NPras, я не знал «IsInitialized» и др., Но я уверен, что это то, что я ищу. Я проверю, и вы можете принять этот ответ, чтобы его приняли. – ProfK
Не можете ли вы убедиться, что коллекция инициализируется при загрузке пользователей с активной загрузкой? Мне кажется громоздким напоминание о вызове EnsureCollectionXIsLoaded каждый раз, когда используется CollectionX. – Firo