2010-11-29 59 views
3

我有一个ProbateCases表和一个属性表的数据库。属性表对ProbateCases表有一个名为ProbateCaseId的外键,所以ProbateCases和Properties之间的关系是一对多关系。流利NHibernate:外键字段没有设置在单向关联

我的域图层有一个ProbateCase类和一个Property类。该ProbateCase类有定义的属性集合如下:

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; 
    } 

的功能NHibernate映射的相应部分看起来是这样的:

HasMany(x => x.Properties).Where("Deleted = 0").KeyColumn("ProbateCaseId").Cascade.All().Access.CamelCaseField(Prefix.Underscore); 

注意,该协会是单向的 - 该ProbateCase类有一个属性集合,但Property类没有ProbateCase成员。

我发现查询工作正常--NHibernate正在创建适当的SQL来获取具有相应ProbateCaseId值的属性。

但是,当我保存一个ProbateCase时,我添加了一个新的属性,INSERT SQL不包含外键字段的值 - 所以我得到一个SQL异常抱怨外键中的NULL值:

INSERT INTO AdminOverview.Properties (PropertyName) VALUES ('Name of property') -- Where the hell is the ProbateCaseId field value??? 

我应该期待NHibernate填充外键值本身,还是有什么我应该做的?

回答

2

http://nhibernate.info/doc/nh/en/index.html#collections-onetomany

非常重要的注意事项:如果一个协会的列声明NOT NULL,NHibernate的可能导致违反约束时,它会创建或更新关联。为了防止这个问题,你必须使用与被标记为inverse =“true”的许多有价值的结尾(集合或行李)的双向关联。请参阅本章后面关于双向关联的讨论。

+0

谢谢迭戈。我之前看到过这个,但对我来说并没有什么意义。这不是FK字段是否可空的问题。我需要该字段由NHibernate设置,它不是。我不知道为什么。无论如何,我已经通过使该关联成为双向的方式来解决它(但是这是一个黑客攻击),因为从属性中访问ProbateCase从语义上讲没有意义。 – David 2010-11-29 13:09:20