NHibernate ReferencesAny оттягивая неправильный тип - PullRequest
1 голос
/ 22 июля 2011

У меня есть таблица AdministratorPrivilages со следующими полями:

  • ID
  • Элемент списка
  • MemberId
  • Значение
  • MemberType

Теперь члены могут быть двух типов (Enterprise и Express).Члены предприятия живут в таблице предприятия.Экспресс-члены живут в таблице экспресс-членов.Я попытался сделать свое беглое отображение следующим образом.

public class AdministratorPrivilegesMapping : ClassMap<AdministratorPrivileges>
    {
        public AdministratorPrivilegesMapping()
        {
            Id(x=>x.Id);
            Map(x => x.Value).Column("Value");
            ReferencesAny(x => x.Member)
                .EntityTypeColumn("MemberType")
                .EntityIdentifierColumn("MemberId")
                .IdentityType<Int32>()
                .AddMetaValue<ExpressMember>("Express")
                .AddMetaValue<Member>("Enterprise");

        }
    }

Обе таблицы-члены имеют целочисленные идентификаторы с возрастающими значениями.Когда я пытаюсь отозвать привилегии, связанные с корпоративным членом 10, я получаю набор разрешений, связанный с Express Member 10. Обе другие таблицы сопоставляются с файлами сопоставления старой школы hbm.

Я что-то упустилочевидно?Я использую NHibernate 2.1 и FluentNhibernate 1.1

Ответы [ 2 ]

2 голосов
/ 09 августа 2012

Я действительно нашел решение, используя .Where ().Моя ситуация немного отличается, у меня есть objectA и objectB.objectA содержит objectB, но objectB также содержит коллекцию objectBs.

"objectA": {"someProp": "(string)", "objectB": {"someProp": "(string)", "comeCol ": [" (objectB) "]}}

Таким образом, свойство" Parent "для objectB может иметь тип objectB или objectA, поэтому мне нужно было использовать ReferencesAny при отображении objectB.

Отображение выглядит как

        ReferencesAny( x => x.Parent )
            .IdentityType< int >()
            .MetaType< string >()
            .EntityTypeColumn( "ParentType" )
            .EntityIdentifierColumn( "ParentId" )
            .AddMetaValue< objectA >( "E" )
            .AddMetaValue< objectB >( "S" )
            .Access.Property()
            .LazyLoad()
            .Cascade.All();

Все это хорошо работает при сохранении, однако моя проблема возникла при извлечении, потому что фреймворк не говорил, что извлекать, и просто извлекал все.

Итак, теперь приведено сопоставление коллекции, которая устранила проблему:

        HasMany( x => x.objectBs )
            .KeyColumn( "ParentId" )
            .Where( "ParentType = 'S'" )
            .Cascade.All()
            .LazyLoad();

Надеюсь, что это поможет любому, кто находится в такой же ситуации:)

1 голос
/ 22 июля 2011

Как всегда, когда я публикую сообщения в Stackoverflow, я совершенно бездельничаю и скучаю по чему-то явно очевидному, что прояснилось после хорошего ночного отдыха и небольшого количества кофеина. Мне нужно было посмотреть на сопоставления для классов ExpressMember и Member. Оказывается, что там не были должным образом отсортированы объявления сумок по типу объекта. Первоначально я думал, что сделал решающее изменение, хотя на самом деле это была очень старая проблема. Столкновение номеров идентификаторов между двумя различными типами участников не было проблемой в течение очень долгого времени, так как экспресс-члены обычно имеют либо все разрешения, либо их вообще нет, как и большинство старых членов (которые были созданы в первую очередь под администратором / Схема Плебе с привилегиями, которые будут раскрыты позже).

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