我有这两个类
[DataServiceKey("Id")]
public class EmailMessage
{
[DataMember]
public virtual long Id { get; set; }
[DataMember]
public virtual string Scope { get; set; }
[DataMember]
public virtual long ScopeId { get; set; }
...
[DataMember]
public virtual IList<BinaryDataView> Attachments { get; set; }
}
和
public class BinaryDataView
{
[DataMember]
public virtual long BinaryId { get; set; }
[DataMember]
public virtual string ExternalLink { get; set; }
}
我正在尝试为他们创建一个propher nhibernate映射,但是,数据库已经足够老了,我无法使用forenkeys。两个数据库(tEmail和tBinaryData)都包含Scope和ScopeId字段,我需要使用它们来获取BinaryData。
这就是我在hbm.xml中的类看起来的样子:
<class name="EmailMessage" table="tEmail">
<id name="Id">
<column name="EmailId" sql-type="bigint"/>
<generator class="native" />
</id>
<property name="DataOwnerId" />
<property name="Scope"/>
<property name="ScopeId"/>
<property name="From" column="[From]"/>
<property name="To" column="[To]"/>
<property name="Subject"/>
<property name="Body"/>
<bag name="Attachments" lazy="false" fetch="join" generic="true">
<key>
<column name="Scope" />
<column name="ScopeId" />
</key>
<one-to-many class="Entities.BinaryDataView,Entities" not-found="ignore"/>
</bag>
</class>
和
<class name="BinaryDataView" table="tBinaryData" >
<id name="BinaryId">
<column name="BinaryId" sql-type="bigint"/>
<generator class="native" />
</id>
<property name="ExternalLink"/>
</class>
现在我得到:外键(FK66731BD76FED2100:tBinaryData [Scope,ScopeId]))必须与引用的主键(tEmail [EmailId])错误具有相同的列数。 所以,我的问题是:我错在哪里以及我做错了什么?如何在不使用Scope和ScopeId的forenkeys的情况下创建此映射?
抱歉我的英语不好。
更新 管理创建映射。至少现在它的工作:
<class name="EmailMessage" table="tEmail">
<id name="Id">
<column name="EmailId" sql-type="bigint"/>
<generator class="native" />
</id>
<property name="DataOwnerId" />
<property name="Scope" />
<property name="ScopeId" />
<properties name="ScopeInfo">
<property name="Scope" column="Scope"/>
<property name="ScopeId" column="ScopeId"/>
</properties>
<property name="From" column="[From]"/>
<property name="To" column="[To]"/>
<property name="Subject"/>
<property name="Body"/>
<bag name="Attachments" lazy="false" fetch="join" generic="true">
<key property-ref="ScopeInfo" foreign-key="none">
<column name="Scope" />
<column name="ScopeId" />
</key>
<one-to-many class="Entities.BinaryDataView,Entities" not-found="ignore"/>
</bag>
</class>
答案 0 :(得分:0)
问题是EmailMessage导出两个键,scope和scopeId作为附件,但你的BinaryDataView只有一个ID BinaryID。导出的密钥必须与其他密钥的ID匹配。该错误消息实际上与DB中的ForeignKeys无关。你的映射是错误的。 考虑使用scope和scopeid
向BinaryDataView添加复合ID