2010-11-15 2 views
1

je l'entité suivante:Dictionnaire ne persistera pas avec NHibernate 3.0

public class Alert 
{ 
    public virtual int Id { get; set; } 
    public virtual string Name { get; set; } 
    public virtual IDictionary<CxChannel, string> Messages { get; set; } 
} 

public enum CxChannel 
{ 
    Message, 
    Email 
} 

et cartographie suivante:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"> 
    <class name="Entities.Alert, Entities" table="alert"> 
    <id name="Id" type="int" unsaved-value="0" access="property"> 
    <generator class="identity"/> 
    </id> 

    <property name="Name" column="name"/> 
    <map name="Messages" table="alert_message" cascade="all"> 
     <key column="alert_id"/> 
     <index column="channel" type="Entities.CxChannel, Entities"/> 
     <element column="message" type="System.String"/> 
    </map> 
    </class> 
</hibernate-mapping> 

Le problème est que lorsque j'enregistre une entité d'alerte, le dictionnaire de messages n'est pas persisté à la base de données. En fait, mon code ressemble au code Oren utilisé dans son blog: http://ayende.com/Blog/archive/2009/06/03/nhibernate-mapping-ndash-ltmapgt.aspx

Quelqu'un at-il rencontré le même problème?

+0

Est-ce que vous commettez la transaction? –

+0

Oui Diego. En outre, la table d'alerte est remplie avec ses données. –

Répondre

1

Vérifiez que la colonne de votre canal est un nombre entier dans votre schéma car l'énumération CxChannel sera mappée en tant que 0 (pour Message) et 1 (pour le courrier électronique). Je viens de coller votre code et vos mappages dans un projet de console, j'ai utilisé SchemaExport (cfg) .Execute (false, true, false) et j'ai correctement inséré des lignes dans la base de données générée.

+0

Merci James. La colonne de canal est un nombre entier dans mon schéma. Intéressant que vous pourriez le faire fonctionner. Je vais utiliser votre approche et voir ce que je peux trouver. –

+0

Je me demande s'il y a quelque chose d'étrange dans votre schéma. Je voudrais faire un SchemaExport dans une base de données propre, puis diff le schéma généré et votre schéma en utilisant un outil comme DataDude ou RedGate SQL Compare. (BTW - J'utilisais NH3 build 3.0.0.2001 Cela ne devrait pas faire de différence, mais juste au cas où ...) –

+0

J'ai essayé de la même manière que vous avez expliqué et NHibernate n'a pas inséré de données dans alert_message. Avez-vous interrogé pour voir si vous avez les mêmes données que vous avez inséré dans les messages? J'ai mis show_sql = true pour NHibernate et lazy = false pour la carte et j'ai remarqué que NHinbernate génère INSERT seulement pour l'alerte. Mais quand j'ai essayé de charger les données, il les récupère aussi à partir de alert_message. –

Questions connexes