繁体   English   中英

NHibernate中多对一关联的问题

[英]Problem with many-to-one association in NHibernate

我有两节课:

public class Article
{
    private ISet<IdentNumber> identNumbers = new HashedSet<IdentNumber>();

    public virtual int ArticleId { get; set; }

    public virtual string ArticleNumber { get; set; }

    private virtual ISet<IdentNumber> IdentNumbers

    public virtual void AddIdentNumber(IdentNumber identNumber)
    {
        if (identNumber.Article != null && identNumber.Article.identNumbers != null)
        {
            identNumber.Article.identNumbers.Remove(identNumber);
        }

        identNumber.Article = this;
        this.IdentNumbers.Add(identNumber);
    }
}

public class IdentNumber
{
    public virtual int Number { get; set; }

    public virtual int ArticleId { get; set; }

    public virtual Article Article { get; set; }

    public override bool Equals(object obj)
    {
        if (obj == null)
        {
            return false;
        }

        var x = obj as IdentNumber;
        if (x == null)
        {
            return false;
        }

        return this.Number == x.Number && this.ArticleId == x.ArticleId;
    }

    public override int GetHashCode()
    {
        return (this.ArticleId + "|" + this.Number).GetHashCode();
    }
} 

这些对象应映射到旧数据库中的两个表Articles和IdentNumbers。 Artikles将ArtikleId(PK,int,不为null)作为标识列。 IdentNumbers具有复合PK。 数字(PK,整数,不为空)和ArticleId(PK,FK,整数,不为空)。

这是我到目前为止获得的映射文件:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
  <class name="Article" table="Articles">
    <id name="ArticleId" unsaved-value="0">
      <generator class="native" />
    </id>
    <property name="ArticleNumber" />
    <set name="IdentNumbers" table="IdentNumbers">
      <key column="ArticleId" />
      <many-to-many unique="true" class="IdentNumber" />  
    </set>
  </class>
</hibernate-mapping>

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
  <class name="IdentNumber" table="IdentNumbers">
    <id name="ArticleId" column="ArticleId">
      <generator class="foreign">
        <param name="property">ArticleId</param>
      </generator>
    </id>
    <property name="Number" />
  </class>
</hibernate-mapping>

我想要上班的是这样的:

var article = new Article { ArticleNumber = "9876" };
var identNumber = new IdentNumber { Number = 1234 };
article.AddIdentNumber(identNumber);

session.Save(article);

对于我来说,我无法获得此复合pk,其中一部分是工作的外键。

谢谢您的帮助。

编辑:

多亏了Falcon,我的映射才正确。

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
  <class name="Article" table="Articles">
    <id name="ArticleId" unsaved-value="0">
      <generator class="native" />
    </id>
    <property name="ArticleNumber" />
    <set name="IdentNumbers" table="IdentNumbers" cascade="all">
      <key column="ArticleId" />
      <one-to-many class="IdentNumber" />  
    </set>
  </class>
</hibernate-mapping>

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
  <class name="IdentNumber" table="IdentNumbers">
    <composite-id>
      <key-many-to-one name="Article" column="ArticleId"/>
      <key-property name="Number" />
    </composite-id>
  </class>
</hibernate-mapping>

您不需要ArticleID! 只需将Reference映射到Article类作为PK的一部分即可! 当您设置IdentNumber的Article时,您已经将密钥的这一部分进行了统计。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM