NHibernate,当inverse设置为true时不保存

时间:2011-03-15 15:48:17

标签: c# .net nhibernate fluent-nhibernate automapping

我有一个似乎很简单的问题,但我似乎无法弄明白。如果我在[会员]和[邮件]之间有一对多的关系

如果我取消反转它一切正常,就在我调用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 个答案:

答案 0 :(得分:2)

Inverse = true表示“忽略这种关系,因为我从另一方面保存它”。因此,您需要在尝试时将级别上的保存级联起来。我怀疑问题是你使用Fluent NHibernate进行映射,但是级联是通过NHibernate映射属性注释的。据我所知,流利的NHibernate不会读取属性。因此,您需要一些代码将NHibernate映射属性与Fluent NHibernate混合到Configuration中,或者使用显式的ClassMap或Fluent NHibernate约定来覆盖Member.Mail集合上的级联关系。

答案 1 :(得分:1)

尝试将Cascade.All添加到您的映射中,它通常可以解决我的大多数NHibernate问题=)