在我的数据库中,我有一个用户表'用户'谁对“仆人”有外键约束,谁又对“人”有外键约束。
' Servant'和'人物'现在变成了一个继承,所以' Person'是' Servant'的基类。 在这种情况下,NHibernate并不关心' Servant' ID不再使用' Person' ID。
我遇到的唯一问题是表格中的仆人的外键'用户'现在。 因为' Servant'和'用户' ID在过去不一定是平等的,现在这是一个很大的问题,因为NHibernate试图获取' Servant'用户使用' Servant' ID并在' Person'中查找表
有没有解决这个问题的方法让NHibernate仍然知道' Servant' ID? 我想做的最后一件事就是改变数据库中的任何内容。
答案 0 :(得分:0)
是的,您可以从用户类中提供Servant Collection的映射。看起来像是映射到Servant类的自引用外键,关键在于如何定义映射,您仍然可以将ServentID映射到PersonID。
答案 1 :(得分:0)
您可以使用property-ref
属性加入主键以外的列。
所以,你之前有这样的事情:
<class name="Person">
<id name="Id"
column="Id"
type="Int32"
generator="native" />
</class>
<class name="Servant">
<id name="Id"
column="Id"
type="Int32"
generator="native" />
<many-to-one name="Person"
column="Person_Id"
not-null="true"
unique="true" />
</class>
<class name="User">
<id name="Id"
column="Id"
type="Int32"
generator="native" />
<many-to-one name="Servant"
column="Servant_Id" />
</class>
在不更改数据库架构的情况下,您已删除<class name="Servant">
并将其替换为:
<class name="Person">
<!-- Rest of Person stays the same, except we insert this: -->
<joined-subclass name="Servant">
<key column="Person_Id" />
</joined-subclass>
</class>
即使Person_Id
不是真的 Servant
表的主键,我们也告诉NHibernate假装它是 - 它仍然可以正常工作,只要该列为not null
和unique
。您现在遇到的问题是NHibernate想加入User.Servant_Id = Servant.Person_Id
,因为它认为Person_Id
是Servant
表的主键。
那么,我们该如何解决呢?我们如何让NHibernate继续加入User.Servant_Id = Servant.Id
?
易。我们只是再次向NHibernate说谎,并告诉它User.Servant
属性不应该加入Servant
的主键,而是加入该表的另一个唯一列,{{ 1}}(其中实际上是主键,但是 shhh ,不要告诉NHibernate)。
首先,我们需要将Id
的ID添加为属性。我们将其命名为Servant
,以便不会隐藏我们从ServantId
继承的Id
属性。我们还会相应地设置Person
,insert
和update
以确保NHibernate允许数据库生成此值。
generated
接下来,我们修改<joined-subclass name="Servant">
<key column="Person_Id" />
<property name="ServantId"
column="Id"
insert="false"
update="false"
generated="insert" />
</class>
&#39; User
属性的映射,告诉它加入另一个表中的新属性而不是主键。
Servant
中提琴!上面的描述应该足以绘制图片的所有边(DB Tables,NH Mappings,C#Classes),但如果不是,请告诉我,我可以更明确。