NHibernate映射到'非规范化'表

时间:2012-02-07 03:17:40

标签: nhibernate fluent-nhibernate nhibernate-mapping

我有以下对象模型(基于我无法改变的遗留表结构)。

public class Store
    Contact BillingContact {get;set;}
    Contact SetupContact {get;set;}
    ISet<Contact> Contacts {get;set;}

在这种情况下,当我创建新商店时,我还会在“联系人”列表中添加新联系人。我还想将该联系人设置为BillingContact和SetupContact上的引用。然后将该批次保存为单个事务。如果我保存商店而不设置参考BillingContact和SetupContact,一切都很好。但是当我设置这些属性时,NHibernate尝试在Insert之后执行更新以更新引用,并且因为实际上尚未插入Store而出现错误。

看起来我可能不得不使用触发器或存储过程,但我希望有一种NHibernate方式。

正在运行的SQL是

INSERT INTO CONTACTS (Id, CompanyId, Name, etc.) Values (1234, NULL, "My Contact", etc.)  NOTE: 1234 was retrieved from a sequence

然后

INSERT INTO company (Id, BillingContactId, SetupContactId) Values (8946, 1234, 1234)

然后 - 错误是因为这个

UPDATE CONTACTS SET CompanyId=8946  WHERE CUSTOMER_ID = 1234 AND TimeStamp = xxx

由于插件尚未提交,因此最终语句失败。

错误是     行被另一个事务更新或删除(或未保存的值映射不正确)[Customer#1234]

1 个答案:

答案 0 :(得分:0)

您需要为这些对Save-Update的引用配置级联。这意味着,当您保存或更新实体时,它将“通过级联”保存引用。

http://wiki.fluentnhibernate.org/Getting_started

Mappings 部分中,有一个级联的示例。