2009-08-05 67 views
0

我使用NHibernate与SQL CE桌面数据库,当我尝试进行更新时出现奇怪的错误。 SQL CE引发错误25026:“无法插入外键值,因为对应的主键值不存在。”NHibernate抛出SQL CE错误25026

执行实体对象的集合属性的级联更新时发生异常。实体对象是所有者,集合属性是项目(IList),即特定所有者的项目。在我的数据库中,Owners表的主键是一个三字符的字符串(所有者的首字母),在Projects表中有相应的外键。

这就是为什么我很疑惑:NHibernate可以获取特定所有者的所有记录(例如,“DCV”)。在我的代码中,我可以将一个新的Project对象添加到Owner.Projects中,而没有任何问题。我直接从数据库中获取的Owner对象中获取所有者ID值,所以我知道Owners表中存在主键。但是,当我在我的所有者对象上执行ISession.SaveOrUpdate()时,出现上述的外键错误。

我正在处理一些NHibernate的特质,或者在我的代码或映射中出现一些世俗的错误?任何想法可以帮助我解决这个问题,非常感谢!

大卫Veeneman 远见系统

+0

请在问题中包含您的映射。 – ahsteele 2009-08-05 23:08:45

回答

1

我找到了答案。它与NHibernate如何处理一对多关联有关。从NHibernate Documentation,Sec。 6.4,One-To-Many Associations:

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

如果你有这个问题,暂时移除外键约束并运行你的代码,输出NHibernate的SQL到控制台。你会看到NHibernate首先插入没有外键的新记录,然后调用记录,然后将外键插入到记录中。第一个操作是生成外键错误的操作。

正如NHibernate文档指出的那样,解决方案是使关系成为双向的。