没有键的NHibernate映射

时间:2014-03-14 10:21:54

标签: c# nhibernate mapping nhibernate-mapping

我有这两个类

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

1 个答案:

答案 0 :(得分:0)

问题是EmailMessage导出两个键,scope和scopeId作为附件,但你的BinaryDataView只有一个ID BinaryID。导出的密钥必须与其他密钥的ID匹配。该错误消息实际上与DB中的ForeignKeys无关。你的映射是错误的。 考虑使用scope和scopeid

向BinaryDataView添加复合ID