我有两个类 – 人员和联系人和映射,以加载人的所有联系人.这些示例都经过简化,以便更好地阅读.
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 | --------------------------------------------
每次为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错误?它用主键搞乱了属性引用属性.或者是否有其他方法不创建另一个表(我可以创建一个表,我持有人ID和objectId)?
如果我用主键映射我的表,那么所有的工作就像一个魅力,但我得到了不必要的结果 – 我必须将所有联系人从以前的版本复制到当前和联系人表中,这里有大量的重复行.
编辑:
我想要实现的SQL select子句示例是这样的:
select c.* from persons p inner join contacts c on c.person_objectid = p.objectid where p.id = 1;
那么,你能帮帮我吗?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。