NHibernate, не сохраняется, если для параметра true задано значение true - PullRequest
0 голосов
/ 15 марта 2011

У меня есть очень простой вопрос, но я не могу понять это. Если у меня есть отношения один ко многим между [Member] и [Mail]

Если я снимаю инверсию, все работает, только когда я вызываю instance.inverse, он не сохраняет.

public class Mail : Entity
    {
        public virtual Member Receiver
        {
            get; set;
        }

        public virtual string Subject
        {
            get;
            set;
        }

        public virtual string Body
        {
            get; set;
        }
    }



public class Member : Entity
    {
        public Member()
        {           
            Mail = new List<Mail>();            
        }

        [Cascade(Enums.CascadeOptions.All)]
        public virtual IList<Mail> Mail
        {
            get; set;
        }
    }

Обратное верно для одного ко многим (через соглашение об автоматическом преобразовании)

public class HasManyConvention : IHasManyConvention
    {
        public void Apply(FluentNHibernate.Conventions.Instances.IOneToManyCollectionInstance instance)
        {

            instance.Key.Column(instance.EntityType.Name + "ID");
            instance.Inverse();
}}

Я пытаюсь добавить почтовый элемент участнику через:

mail.Receiver = receiver;
        receiver.Mail.Add(mail);           
        _repository.SaveOrUpdate(mail);
        FlushSessionAndEvict(mail);

Теперь, что странно, почтовый элемент сохраняется в базе данных, есть внешний ключ с именем MemberId, который ДОЛЖЕН иметь внешний ключ к таблице родительского члена, и столбец с именем ReceiverFk, который соответствует моему соглашению, но не должен не будет, если уже есть отношение внешнего ключа с MemberId. Когда я получаю пользователя, к нему не прикрепляется почтовый элемент. Если я снимаю инверсию, все работает, ключ foregin сохраняется в MemberId.

Я не хочу снимать инверсию, потому что это влечет за собой еще один вызов для обновления базы данных. Что я могу сделать?

Спасибо

Ответы [ 2 ]

2 голосов
/ 16 марта 2011

Inverse = true означает «игнорировать эти отношения, потому что я сохраняю их с другой стороны».Поэтому вам нужно каскадировать сохранение на стороне сбора, как вы пытаетесь это сделать.Я подозреваю, что проблема в том, что вы используете Fluent NHibernate для отображения, но каскад аннотируется с помощью атрибутов отображения NHibernate.Свободный NHibernate не читает атрибуты, насколько я знаю.Поэтому вам необходим код для смешивания атрибутов сопоставления NHibernate в конфигурации вместе с Fluent NHibernate или использования явного соглашения ClassMap или Fluent NHibernate для переопределения каскадных отношений в коллекции Member.Mail.

1 голос
/ 15 марта 2011

Попробуйте добавить Cascade.All к вашему отображению, оно обычно решает большинство моих проблем с NHibernate =)

...