Проблема с многозначными ассоциациями в NHibernate - PullRequest
1 голос
/ 10 ноября 2010

У меня есть два класса:

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, not null) в качестве столбца идентификации. IdentNumbers имеет составной ПК. Number (PK, int, not null) и ArticleId (PK, FK, int, not null).

Это файлы сопоставления, которые я получил до сих пор:

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

Я не могу получить этот составной ПК, одна часть которого является внешним ключом для работы.

Спасибо за помощь.

Edit:

Благодаря Соколу я получил правильные отображения.

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

1 Ответ

1 голос
/ 10 ноября 2010

Вам не нужен ArticleID! Просто сопоставьте ссылку на класс Article как часть вашего PK! Когда вы устанавливаете Артикул IdentNumber, вы уже регистрируете эту часть ключа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...