2010-01-03 6 views
2

J'ai un 3 tables qui sont "Nouvelles", "Tags", "News_Tags" avec relation Many-To-Many. Avec le mappage suivant, les tables "News" et "Tags" ont été mises à jour, mais "News_Tags" n'a pas été mis à jour.NHibernate Many to Many table n'est pas mis à jour

Quelqu'un peut-il m'aider?

Nouvelles:

<class name="News" table="News" lazy="false"> 
    <id name="NewsID"> 
    <generator class="identity" /> 
    </id> 
    <property name="Title"/> 
    <set 
    name="TagsList" 
    table="News_Tags" 
    inverse="true" 
    lazy="false" 
    cascade="save-update"> 

     <key column="NewsID" not-null="true" /> 
     <many-to-many class="Tag" column="TagID" /> 
    </set> 
</class> 

Tags:

<class name="Tag" table="Tags" lazy="false"> 
    <id name="TagID"> 
    <generator class="identity" /> 
    </id> 
    <property name="TagName"/> 
    <property name="DateCreated"/> 

    <set 
    name="NewsList" 
    table="News_Tags" 
    inverse="true" 
    lazy="false" 
    cascade="save-update"> 

     <key column="TagID" not-null="true" /> 
     <many-to-many class="News" column="NewsID" /> 
    </set> 

</class> 

News_Tags

<class name="NewsTags" table="News_Tags" lazy="false"> 
    <id name="NewsTagID"> 
    <generator class="identity" /> 
    </id>  
    <property name="TagID"/> 
    <property name="NewsID"/> 
</class> 

merci beaucoup

Daoming.

+0

Désolé, je ne peux pas casser quelques-unes des lignes, sinon il ne sera pas affiché. –

+0

Vous avez besoin de 4 espaces au début de chaque ligne pour le formater en code. À moins qu'il ne soit supprimé ou masqué car interprété en HTML. –

Répondre

2

Il y a des choses étranges dans ce mapping.

  • Les deux collections, et NewsList, sont inverses. NHibernate ne les stocke donc pas. Inverse signifie: "cette information est déjà dans une autre collection, alors ignorez ceci lors du stockage". Mettez l'inverse sur un seul côté de la relation bidirectionnelle.
  • NewsTags est mappé en tant que classe, même s'il ne s'agit pas d'une classe. C'est juste une table dans la base de données, utilisée pour mapper une relation plusieurs-à-plusieurs (bidirectionnelle). Supprimez simplement ce mappage de classe.
  • La cascade est définie par les deux collections. Je ne suis pas sûr si vous voulez créer de nouvelles balises si elles sont référencées par une instance News, mais vous ne voudrez probablement jamais créer de nouvelles instances News car elles sont référencées par une balise. Je voudrais l'enlever là.
+0

Merci beaucoup. Tu as sauvé mon temps. Bon gars. –

1

Je suis d'accord avec @Stefan, vos correspondances ne sont pas correctes. Si je comprends bien qu'il existe une relation many-to-many entre News et Tags, News_Tags est votre table de jonction/jointure, auquel cas vous ne devriez pas avoir à fournir un fichier de mapping. Vos fichiers de correspondance pour News et Tags doivent prendre en charge la table de jonction/jointure sans que vous ayez besoin de la mapper. Considérez les mappings que j'ai entre l'utilisateur et le rôle qui est many-to-many, j'espère que cela fournira quelques conseils.

User Mapping

<?xml version="1.0"?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" auto-import="false"> 

<class name="BM.BEAST.Core.Common.User, BM.BEAST.Core" table="[User]" lazy="false"> 
    <id name="ObjId" column="ObjId" type="Guid"> 
    <generator class="guid"/> 
    </id> 
    <property name="UserName" column="UserName" type="String" not-null="true"/> 
    <property name="FirstName" column="FirstName" type="String" not-null="true"/> 
    <property name="LastName" column="LastName" type="String" not-null="true"/> 
    <property name="Initials" column="Initials" type="String" not-null="true"/> 
    <property name="LastLoginDtm" column="LastLoginDtm" type="Timestamp"/> 
    <property name="Disabled" column="Disabled" type="Boolean"/> 
    <property name="OnLine" column="OnLine" type="Boolean"/>  
    <bag name="Roles" table="UserRole" lazy="true"> 
    <key column="UserObjId"/> 
    <many-to-many class="BM.BEAST.Core.Common.Role, BM.BEAST.Core" column="RoleObjId"/> 
    </bag> 
    <bag name="Sessions" table="Session" lazy="true" cascade="all-delete-orphan"> 
    <key column="ActiveUser"/> 
    <one-to-many class="BM.BEAST.Core.Common.Session, BM.BEAST.Core" not- found="ignore"/> 
    </bag> 
</class> 

Cartographie Rôle

<?xml version="1.0"?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" auto-import="false"> 

    <class name="BM.BEAST.Core.Common.Role, BM.BEAST.Core" table="[Role]" lazy="false"> 
    <id name="ObjId" column="ObjId" type="Guid"> 
     <generator class="guid"/> 
    </id> 
    <property name="Code" column="Code" type="String" not-null="true"/> 
    <property name="Name" column="Name" type="String" not-null="true"/> 
    <property name="Sequence" column="Sequence" type="Int16" not-null="true"/> 
    </class> 

</hibernate-mapping>