1 votes

Erreur d'intrusion lors de l'insertion d'un objet ayant une relation biunivoque avec un autre objet.

J'ai un problème avec nhibernate lorsque j'essaie d'insérer un objet ayant une relation biunivoque avec un autre objet. Il existe une classe appelée Article

Fichier cartographique

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">

<id name="ID" column="article_id" type="Int32" unsaved-value="0">
    <generator class="native"/>
</id>

<property name="Title" column="title" type="String" not-null="true" length="255" />
<property name="Body" column="body" type="String" length="1073741823" />
<property name="IsEnabled" column="is_enabled" type="Boolean" not-null="true" />

<many-to-one name="ParentArticle" class="..." column="parent_id" cascade="all" />

<bag name="Children" lazy="true" cascade="all-delete-orphan" >
  <key column="parent_id" />
  <one-to-many class="..." />
</bag>

La classe elle-même découle de ce fichier de correspondance et est omise pour des raisons de simplicité.

Ensuite, il y a une autre classe appelée SpecialArticle. Le mappage de cette classe est le suivant :

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">

<id name="ID" column="id" type="Int32" unsaved-value="0">
    <generator class="native"/>
</id>

<property name="Price" column="Price" type="Double" not-null="true" />
<one-to-one name="Article" class="..." fetch="join" cascade="all" />

La classe ArticleExtension est alors :

    public class SpecialArticle
{
    /// <summary>
    /// Get/Set the ID for this question
    /// </summary>
    public virtual int ID
    {
        get;
        set;
    }

    /// <summary>
    /// Get/Set the expected price for this question or answer
    /// </summary>
    public virtual Double Price
    {
        get;
        set;
    }

    /// <summary>
    /// Get/Set the article that contains the rest of the information for this question
    /// </summary>
    public virtual Article Article
    {
        get;
        set;
    }
}

quand je veux insérer un article spécial dans la base de données, je le fais :

// Populate someArticle
// Populate someSpecialArticle
// Following code is wrapped in a transaction
someSpecialArticle.Article = someArticle;
Session.SaveOrUpdate(someArticle);
Session.SaveOrUpdate(someSpecialArticle);

L'objet someArticle est inséré correctement, mais l'instruction d'insertion de l'objet someSpecialArticle l'est : INSERT INTO tbl (Price) VALUES (@p0) ; select SCOPE_IDENTITY()

où se trouve l'article_id pour spécifier l'article parent ???

thx

0voto

maciejkow Points 4504

La cartographie correcte est :

<many-to-one name="Article" fetch="join" cascade="all" unique="true" />

Lorsque vous créez un mappage un à un dans NHibernate, un côté doit être mappé comme many-to-one - ce sera le côté responsable du stockage de la clé étrangère. Puisque vous avez une relation unidirectionnelle ici, vous devez la mapper comme many-to-one et utiliser la contrainte unique pour que la relation se comporte comme one-to-one.

0voto

g . Points 4496

Il serait plus facile d'utiliser une relation many-to-one de SpecialArticle à Article. La relation biunivoque peut s'avérer délicate et n'est pas une approche recommandée .

Dans votre cas, il semble que faire en sorte que SpecialArticle étende Article pourrait être une solution appropriée. Vous pourriez alors utiliser un joindre-sous-classe pour obtenir les informations supplémentaires nécessaires pour un article spécial dans la deuxième table.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X