我有一个包含ProbateCases表和Properties表的数据库。 Properties表有一个名为ProbateCaseId的ProbateCases表的外键,因此ProbateCases和Properties之间的关系是一对多的。
我的域层有一个ProbateCase类和一个Property类。 ProbateCase类具有如下定义的Properties集合:
private IList<Property> _properties = new List<Property>();
public virtual IEnumerable<Property> Properties { get { return _properties; } }
public virtual Property AddProperty()
{
Property property = new Property();
_properties.Add(property);
return property;
}
Fluent NHibernate映射的相应部分如下所示:
HasMany(x => x.Properties).Where("Deleted = 0").KeyColumn("ProbateCaseId").Cascade.All().Access.CamelCaseField(Prefix.Underscore);
请注意,关联是单向的 - ProbateCase类有一组Properties,但Property类没有ProbateCase成员。
我发现查询工作正常 - NHibernate正在创建适当的SQL来获取具有相应ProbateCaseId值的Properties。
但是,当我保存我添加了新属性的ProbateCase时,INSERT SQL不包含外键字段的值 - 所以我得到一个SQL异常,抱怨外键中的NULL值: / p>
INSERT INTO AdminOverview.Properties (PropertyName) VALUES ('Name of property') -- Where the hell is the ProbateCaseId field value???
我是否应该期望NHibernate自己填充外键值,或者我还应该做些什么呢?
答案 0 :(得分:3)
来自http://nhibernate.info/doc/nh/en/index.html#collections-onetomany:
非常重要注意:如果关联的列声明为NOT NULL,则NHibernate在创建或更新关联时可能会导致约束违规。要防止出现此问题,必须使用标记为inverse =“true”的多值结束(集合或包)的双向关联。请参阅本章后面的双向关联讨论。