J'ai deux classes:problème avec l'association many-to-one dans 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();
}
}
Ces objets doivent être mis en correspondance avec deux tables et articles IdentNumbers dans une base de données existante. Artikles a ArtikleId (PK, int, not null) en tant que colonne d'identité. IdentNumbers a un PK composite. Number (PK, int, not null) et ArticleId (PK, FK, int, non null).
Ce sont les fichiers de mappage j'ai obtenu jusqu'à présent:
<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>
Ce que je veux aller au travail est quelque chose comme ceci:
var article = new Article { ArticleNumber = "9876" };
var identNumber = new IdentNumber { Number = 1234 };
article.AddIdentNumber(identNumber);
session.Save(article);
Je ne peux pas pour le live de me faire ce pk composite avec une partie de celui-ci étant une clé étrangère pour travailler.
Merci pour l'aide.
Edit:
Merci à Falcon i obtenu les correspondances droite.
<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>
Votre correspondance ne correspond pas à votre description - voir le http://www.nhforge.org/doc/nh/fr/index.html#mapping-declaration-compositeid pour un exemple de ce que je pense que vous êtes essayer de faire –
Regardez session.load() – UpTheCreek
J'ai essayé d'utiliser un ID composé avec l'article dans la clé-plusieurs-à-un, mais je ne peux pas spécifier le générateur class = "foreign" sur ce point. – Cypher1312