简体   繁体   中英

Problem with many-to-one association in NHibernate

I have two classes:

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();
    }
} 

These objects should be mapped to two tables Articles and IdentNumbers in a legacy database. Artikles has ArtikleId (PK, int, not null) as an identity column. IdentNumbers has a composite PK. Number (PK, int, not null) and ArticleId (PK, FK, int, not null).

This are the mapping files i got so far:

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

What i want to get to work is something like this:

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

session.Save(article);

I can't for the live of me get this composite pk with one part of it being a foreign key to work.

Thanks for the help.

Edit:

Thanks to Falcon i got the mappings right.

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

You don't need the ArticleID! Just map the Reference to the Article class as part of your PK! When you set the Article of the IdentNumber you already statisfy that part of the key.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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