我有一个似乎很简单的问题,但我似乎无法弄明白。如果我在[会员]和[邮件]之间有一对多的关系
如果我取消反转它一切正常,就在我调用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中。
我不想取消反转,因为它需要对数据库进行另一次更新调用。我该怎么办?
由于
答案 0 :(得分:2)
Inverse = true表示“忽略这种关系,因为我从另一方面保存它”。因此,您需要在尝试时将级别上的保存级联起来。我怀疑问题是你使用Fluent NHibernate进行映射,但是级联是通过NHibernate映射属性注释的。据我所知,流利的NHibernate不会读取属性。因此,您需要一些代码将NHibernate映射属性与Fluent NHibernate混合到Configuration中,或者使用显式的ClassMap或Fluent NHibernate约定来覆盖Member.Mail集合上的级联关系。
答案 1 :(得分:1)
尝试将Cascade.All
添加到您的映射中,它通常可以解决我的大多数NHibernate问题=)