使用property-ref的一对多映射不在主键上

时间:2014-02-02 20:57:11

标签: c# nhibernate nhibernate-mapping

我有一个我无法解决的问题。也许有人遇到过类似的问题。

我有两个类 - 人员和联系人以及映射以加载人的所有联系人。这些例子都经过简化,以便更好地阅读。

Person.cs

public class Person
{
   public long Id { get; set; }
   public long ObjectId { get; set; }
   public IList<Contact> Contacts { get; set; }
}

Contact.cs

public class Contact
{
   public long Id { get; set; }
   public string Text { get; set; }
}

Person.hbm.xml

<property name="ObjectId" type="System.Int64" column="OBJECTID" />
<bag name="Contacts" lazy="true" cascade="all">
   <key column="PERSON_OBJECTID" property-ref="ObjectId" not-null="true" />
   <one-to-many class="Contact" />
</bag>

联系人没有人员的任何映射,他们只是不需要它。

一个人可以有多个联系人,一个联系人只能拥有一个所有者。但是当我的一些数据发生变化时,我会创建人员版本,因为我需要记录变化的历史。所以表格如下:

人员表

----------------------------------------
| ID | OBJECTID | FIRSTNAME | LASTNAME |
----------------------------------------
| 1  |    100   |   David   |   Gray   |
| 2  |    100   |   David   |   Gray   |
| 3  |    100   |   David   |   Gray   |
----------------------------------------

联系表

--------------------------------------------
| ID | PERSON_OBJECTID |        TEXT       |
--------------------------------------------
| 1  |       100       | email@email.com   |
| 2  |       100       | some phonenumber  |
--------------------------------------------

每次为CONTACTS创建版本时,我都不想复制PERSON个表行 - 所以我想使用ObjectId字段,而对于一个人来说,它总是相同的。此映射成功将数据保存到数据库,但并不总是成功检索它。有时我会收到错误

  

初始化[Person#100] - 懒得初始化一个集合   角色:Person.Contacts,没有关闭会话或会话

在错误中,我可以看到它显示了一个#ObjectId,通常有一个#Id。也许有一些与此问题相关的NHibernate错误?它用主键搞乱了属性引用属性。或者是否有其他方法不创建另一个表(我可以创建一个表,其中我持有人ID和objectId)?。

如果我用主键映射我的表,那么所有的工作都像魅力一样,但我得到了不需要的结果 - 我必须将所有联系人从以前的版本复制到当前和联系人表中,这里有大量的重复行。

修改

我想要实现的SQL select子句示例是这样的:

select c.* from persons p
inner join contacts c on c.person_objectid = p.objectid
where p.id = 1;

那么,你能帮帮我吗? :)

1 个答案:

答案 0 :(得分:1)

NH中有一个奇怪的问题与属性引用相关,你需要,出于某种原因,即使它不是真的,要添加 - unique =&#34; true&#34;到属性ref映射。

在Person.hbm.xml中尝试此操作 -

<property name="ObjectId" type="System.Int64" column="OBJECTID" unique="true"/>