NHibernate загружает прокси-объекты в поведении, которое я не могу контролировать - PullRequest
4 голосов
/ 24 ноября 2011

My schema

У меня есть диаграмма классов, похожая на картинку выше. Я использую NHibernate для выполнения команд CRUD на объектах. Когда я пишу в таблицу разрешений (добавляет роль в коллекцию ролей пользователя и наоборот), NHibernate начинает вести себя странно. У меня есть метод с именем UpdateRoles (), который обеспечивает актуальность всех ролей. Этот метод дает сбой, так как NHibernate иногда генерирует прокси-объекты, поэтому UpdateRoles () теперь думает, что Роль не существует и создает новый объект (что приводит к дублированию моей иерархии). Я нашел шаблон для случая, когда NHibernate загружает объекты в качестве прокси:

enter image description here

Случай 1 работает, случай 2 - нет. В случае 1 пользователь добавляется в пользовательскую коллекцию каждой роли на каждом из 3 уровней иерархии. Это работает как задумано.

В случае 2 пользователь добавляется только на последний уровень в иерархии. Теперь родительская роль (uCommerce) загружается как прокси-объект. Моя RoleMap выглядит так:

References(x => x.ParentRole).Nullable().Column("ParentRoleId");                    
HasManyToMany(x => x.Users).AsSet().Table("uCommerce_Permission");          
HasMany(x => x.Roles).Inverse().KeyColumn("ParentRoleId").Cascade.AllDeleteOrphan();

Моя UserMap выглядит так:

HasManyToMany(x => x.Roles).AsSet().Table("uCommerce_Permission");    

Как я могу помешать NHibernate сделать это? Я использую Fluennt NHibernate. Указание Not (). LazyLoad () не предотвращает проблему. Также я читал, что указание такого - плохой случай программирования.

1 Ответ

0 голосов
/ 24 ноября 2011

1)

var proxy = parent as INHibernateProxy;
if (proxy != null)
{
    // var t = x.GetType(); becomes
    var t = proxy.HibernateLazyInitializer.GetImplementation().GetType();
}

или 2)

References(x => x.ParentRole).Nullable().Column("ParentRoleId").Not.LazyLoad();

или 3)

ReferencesAny(x => x.ParentRole)
    .Nullable()
    .EntityIdentifierColumn("ParentRoleId")
    .EntityTypeColumn("parentdiscriminator");

typeof(CreateProductRole).IsAssignableFrom(role.Parent.GetType()).

1) и 2) в основном одинаковы, родитель не загружен

3) означает, что каждая роль знает тип своего родителя, поэтому при создании прокси-сервера он является прокси-сервером для фактического типа роли (CreateProductRoleProxy), а не RoleProxy

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...