C# Fluent NHibernate有许多收集问题

C# Fluent NHibernate有许多收集问题,c#,nhibernate,fluent-nhibernate,domain-driven-design,bdd,C#,Nhibernate,Fluent Nhibernate,Domain Driven Design,Bdd,更新: 似乎将我的映射从Cascade.All()更改为Cascade.AllDeleteOrphan()可以解决我的大部分问题。我仍然需要在OperatingState上显式设置Company属性,这似乎是不必要的,因为它正在添加到公司实体中,但至少我可以在更新期间使用它。我还需要用create测试一下 如果有人能解释这一点,那将是一个很大的帮助 更新2:在玩了一段时间后,我似乎不必总是指定父实体 原创帖子 我有2个相关实体 public class Company { //.

更新: 似乎将我的映射从Cascade.All()更改为Cascade.AllDeleteOrphan()可以解决我的大部分问题。我仍然需要在OperatingState上显式设置Company属性,这似乎是不必要的,因为它正在添加到公司实体中,但至少我可以在更新期间使用它。我还需要用create测试一下

如果有人能解释这一点,那将是一个很大的帮助

更新2:在玩了一段时间后,我似乎不必总是指定父实体

原创帖子

我有2个相关实体

public class Company {
        //... fields
        public virtual IList<OperatingState> OperatingStates { get; set; }
}

public class OperatingState {
        public virtual Company Company { get; set; }// Mapped on CompanyID
        public virtual string State { get; set; }
}
它爆炸了:

无法将值NULL插入到 “公司ID”列,表 “ConsumerCartel.dbo.CompanyOperatingState”; 列不允许空值。插入 失败。声明已被修改 终止

然而,如果我做了两个改变,它会起作用

Company company = _repo.GetSingle(123);
 // don't clear the list this time;
 foreach(string state in form["OperatingStates"].Split(',')) {
    OperatingState os = new OperatingState(state);
    // explicitly setting the company
    os.Company = company;
    company.OperatingStates.Add(os);
 }
 _repo.Save(company); // calls ISession.SaveOrUpdate
这将在旧州的基础上增加新州,这不是我想要的。但是,即使在显式设置公司时(当它添加到映射列表中时,我不应该这样做。)如果清除列表,它也不起作用


这段代码已经在其他实体上工作过,但在这个实体上没有,所以我认为这段应该像写的那样工作。我做错了什么?

您尝试过使用Inverse()吗


谢谢你的回答。实际上,.Inverse帮助我找到了.AllDeleteOrphan()选项。
Company company = _repo.GetSingle(123);
 company.OperatingStates.Clear();
 foreach(string state in form["OperatingStates"].Split(',')) {
    company.OperatingStates.Add(new OperatingState(state));
 }
 _repo.Save(company); // calls ISession.SaveOrUpdate
Company company = _repo.GetSingle(123);
 // don't clear the list this time;
 foreach(string state in form["OperatingStates"].Split(',')) {
    OperatingState os = new OperatingState(state);
    // explicitly setting the company
    os.Company = company;
    company.OperatingStates.Add(os);
 }
 _repo.Save(company); // calls ISession.SaveOrUpdate
HasMany(x => x.OperatingStates)
    .Inverse()
    .Cascade.All()
    .Table("OperatingState");