Как сопоставить защищенную коллекцию в Fluent NHibernate?

Я пытался использовать свойство Reveal во Fluent, но не могу заставить его скомпилироваться с коллекцией. Я хочу, чтобы одна из моих коллекций в объекте была защищена и недоступна нигде, кроме самого объекта. Это возможно? Спасибо

Редактировать:

Вот код, который я пытаюсь использовать,

HasMany<Trip>(x => Reveal.Property<Trip>("_trips"));

Я также пробовал этот код,

HasMany<Trip>(Reveal.Property<Organization>("_trips"));

Каждый раз, когда мое приложение запускается, NHibernate говорит, что не может сопоставить «Свойство», или выдает неизвестное исключение.


person CalebHC    schedule 15.07.2009    source источник
comment
Reveal должен работать с коллекциями, не могли бы вы показать нам, как вы это делаете?   -  person James Gregory    schedule 15.07.2009
comment
Как определяется ваша Trip модель?   -  person Daniel A. White    schedule 20.07.2009
comment
Вы когда-нибудь получали ответ на исключение Nhibernate на Property, я получаю то же самое   -  person Duncan Roosma    schedule 18.01.2013


Ответы (2)


Предположим, что у организации есть список IList ‹Trip›.

HasMany<Trip>(Reveal.Property<Organization>("_trips"));

код должен работать. Убедитесь, что это свойство и что у вас есть защищенные геттеры и сеттеры (частные не будут работать, так как NHibernate захочет проксировать коллекцию для отложенной загрузки).

person Bruno Lopes    schedule 20.10.2009
comment
Как вы сказали, я думаю, что ключ в том, чтобы убедиться, что это IList, а не список. Я просто обращаю внимание на эту деталь, так как я только что прочитал ваш ответ, а затем приступил к реализации в виде List‹T›... возможно, этот комментарий поможет кому-то еще избежать этой ошибки. - person Seth Petry-Johnson; 09.01.2010
comment
очень поздний комментарий на эту тему. Но знаете ли вы, доволен ли Nhibernate полем. Или вам нужно использовать свойства? Я бы предпочел поле в моем текущем проекте - person Magnus Backeus; 20.04.2011
comment
Вы можете использовать поля. В FNH, я думаю, вам нужно изменить модификатор .Access, и должна быть опция для поля. - person Bruno Lopes; 20.04.2011
comment
Да, есть много вариантов этого синтаксиса, которые кажутся правильными, но не работают. Что меня обмануло, так это то, что Reveal.Member‹TYPE› — это класс-владелец, а не тип списка. - person PandaWood; 03.08.2015

Самый простой ответ — разрешить сопоставление защищенных внутренних виртуальных свойств. Этот документ находится в документации NHibernate Fluent. .

  1. Перейдите к файлу AssemblyInfo.cs (в разделе «Свойства») и добавьте следующее: [assembly: InternalsVisibleTo("MyDomain.mapping")], где строка — это пространство имен сопоставления.
  2. создавать свойства с объявлениями защищенного внутреннего виртуального доступа.

        protected internal virtual IList<Clinician> __AppointmentMemberAttendees { get; set; }
    
  3. Элементы карты, как обычно.

        HasManyToMany(x => x.__AppointmentMemberAttendees)
               .Table("__AppointmentToAttendeesMember")
               .Cascade.None();
    
person Juls    schedule 04.04.2019