2011-06-06 4 views
2

Je ces tables/classes (exemple):Courant NHibernate problème de cartographie

table FirstTable (
    Id INTEGER NOT NULL DEFAULT AUTOINCREMENT, 
    Name VARCHAR(100) NOT NULL, 
    Document VARCHAR(20) NOT NULL 
) 

table SecondTable (
    Id INTEGER NOT NULL, 
    Something VARCHAR(100) NULL, 
    FOREIGN KEY (Id) REFERENCES FirstTable (Id) 
) 

public class FirstClass { 
    public string Name { get; set; } 
    public string Document { get; set; } 
    public SecondClass SecondClass { get; set; } 
} 

public class SecondClass { 
    public string Something { get; set; } 
    public FirstClass FirstClass { get; set; } 
} 

La cartographie est:

public class FirstClassMap : ClassMap<FirtsClass> { 
    Table("FirstTable"); 
    Id(x => x.Id).GeneratedBy.Identity(); 
    Map(x => x.Name); 
    Map(x => x.Document); 
    References(x => x.SecondClass, "Id").ForeignKey(); 
} 

public class SecondClassMap : ClassMap<SecondClass> { 
    Table("SecondTable"); 
    Id(x => x.Id).GeneratedBy.Foreign("FirstClass"); 
    Max(x => x.Something); 
    HasOne(x => x.FirstClass).PropertyRef(x => x.SecondClass).Cascade.SaveUpdate(); 
} 

FirstClass peuvent avoir (0,1) de seconde classe, et peuvent avoir de seconde classe (1,1) Première classe.

Le code ci-dessous renvoient l'erreur « a tenté d'attribuer id null un à une propriété: deuxième classe »

var test = new SecondClass(); 
test.FirstClass = new FirstClass(); 

test.Something = "New test"; 
test.FirstClass.Name = "My name"; 
test.FirstClass.Document = "My document"; 
// ... commands to save. 
+0

Cela fonctionne-t-il lorsque vous inversez l'instanciation? Instanciez d'abord FirstClass puis attribuez-lui une nouvelle SecondeClasse. – Variant

+0

Salut @Variant, j'ai essayé, mais n'a pas fonctionné. Tks. – Cesar

Répondre

2

Il semble que NH tente de sauver deuxième classe premier et ne parvient pas à saisir un identifiant généré de la FirstClass pas encore enregistrée.

Essayez de déplacer le .Cascade.SaveUpdate() vers la déclaration References dans FirstClassMap et d'appeler la commande de sauvegarde sur FirstClass.

+0

Cela fonctionne, tks, je sauve le FirstClass avec SecondClass null, après avoir défini SecondClass dans FirstClass et enregistrer. Tks. +1 – Cesar

Questions connexes