gpt4 book ai didi

c# - 属性引用不在主键上的一对多映射

转载 作者:行者123 更新时间:2023-11-30 12:46:05 26 4
gpt4 key购买 nike

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

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

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>

Contacts 没有任何 Persons 的映射,他们只是不需要它。

一个人可以有多个联系人,一个联系人只能有一个所有者。但是当某些人的某些数据发生变化时,我会创建他们的版本,因为我需要保留更改历史记录。所以表格看起来像这样:

人员表

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

每次为 PERSON 创建版本时,我不想复制 CONTACTS 表行 - 所以我想使用 ObjectId 字段,它始终与一个人。此映射成功地将数据保存到数据库,但并不总是成功检索数据。有时我会出错

Initializing[Person#100]-failed to lazily initialize a collection of role: Person.Contacts, no session or session was closed

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

如果我用主键映射我的表,那么一切都像一个魅力,但我得到了不想要的结果 - 我必须将所有联系人从以前的版本复制到当前版本,并且在联系人表中有大量重复的行。

编辑:

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

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

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

最佳答案

NH 中有一个奇怪的问题与 property-ref 相关联,出于某种原因,您需要将 - unique="true"添加到 property-ref 映射中,即使它不是真的。

在 Person.hbm.xml 中试试这个 -

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

关于c# - 属性引用不在主键上的一对多映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21516149/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com