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