2009-02-25 9 views
21

Comment activer les sauvegardes en cascade à l'aide du modèle de persistance AutoMap avec NHibernate Fluent?Sauvegarde en cascade avec NHIVernate AutoMapping fluide

Comme dans:

Je sauver la personne et le bras doit également être sauvé. Actuellement, je reçois

"objet référence une instance transitoire non enregistré - enregistrer l'instance transitoire avant le rinçage"

public class Person : DomainEntity 
{ 
    public virtual Arm LeftArm { get; set; } 
} 

public class Arm : DomainEntity 
{ 
    public virtual int Size { get; set; } 
} 

Je trouve an article on this topic, mais il semble être dépassée.

+0

Serait-ce fait en utilisant une convention? –

Répondre

13

Cela fonctionne avec les nouveaux bits de configuration. Pour plus d'informations, consultez http://fluentnhibernate.wikia.com/wiki/Converting_to_new_style_conventions

//hanging off of AutoPersistenceModel  
.ConventionDiscovery.AddFromAssemblyOf<CascadeAll>() 


public class CascadeAll : IHasOneConvention, IHasManyConvention, IReferenceConvention 
{ 
    public bool Accept(IOneToOnePart target) 
    { 
     return true; 
    } 

    public void Apply(IOneToOnePart target) 
    { 
     target.Cascade.All(); 
    } 

    public bool Accept(IOneToManyPart target) 
    { 
     return true; 
    } 

    public void Apply(IOneToManyPart target) 
    { 
     target.Cascade.All(); 
    } 

    public bool Accept(IManyToOnePart target) 
    { 
     return true; 
    } 

    public void Apply(IManyToOnePart target) 
    { 
     target.Cascade.All(); 
    } 
} 
+0

Merci pour la mise à jour. –

+0

Merci. J'ai effectivement utilisé l'exemple plus court de Kristoffers mais je suis sûr que celui-ci fonctionne aussi –

1

Vous pouvez également faire en cascade la convention par défaut pour tous les types. Par exemple (en utilisant l'article auquel vous avez lié comme point de départ):

autoMappings.WithConvention(c => 
    { 
    // our conventions 
    c.OneToOneConvention = o => o.Cascade.All(); 
    c.OneToManyConvention = o => o.Cascade.All(); 
    c.ManyToOneConvention = o => o.Cascade.All(); 
    }); 
3

La méthode conventionnelle Les signatures ont changé. Pour la nouvelle réponse qui fait exactement ce que cette question demande voir THIS QUESTION.

13

Mise à jour pour une utilisation avec la la version actuelle:

public class CascadeAll : IHasOneConvention, IHasManyConvention, IReferenceConvention 
{ 
    public void Apply(IOneToOneInstance instance) 
    { 
     instance.Cascade.All(); 
    } 

    public void Apply(IOneToManyCollectionInstance instance) 
    { 
     instance.Cascade.All(); 
    } 

    public void Apply(IManyToOneInstance instance) 
    { 
     instance.Cascade.All(); 
    } 
} 
+1

Pour "public void Apply (IOneToManyCollectionInstance instance) ", je trouve aussi utile d'avoir "instance.inverse();" en plus de "instance.Cascade.All()." – Antony

+0

Merci à ce code a travaillé pour moi. –

+0

@Antony L'inverse a fait l'affaire pour moi. Merci! –

4

La meilleure façon que j'ai trouvé à faire pour tout un projet est d'utiliser DefaultCascade:

.Conventions.Add(DefaultCascade.All());  

Aller à "The Simplest Conventions" section sur le wiki, pour cela, et une liste d'autres.

est Voici la liste du Wiki:

Table.Is(x => x.EntityType.Name + "Table") 
PrimaryKey.Name.Is(x => "ID") 
AutoImport.Never() 
DefaultAccess.Field() 
DefaultCascade.All() 
DefaultLazy.Always() 
DynamicInsert.AlwaysTrue() 
DynamicUpdate.AlwaysTrue() 
OptimisticLock.Is(x => x.Dirty()) 
Cache.Is(x => x.AsReadOnly()) 
ForeignKey.EndsWith("ID") 

Un mot d'avertissement - quelques-uns des noms de méthode dans le wiki peut être erroné. J'ai édité le Wiki avec ce que j'ai pu vérifier (c'est-à-dire DefaultCascade et DefaultLazy), mais je ne peux pas garantir le reste. Mais vous devriez être capable de comprendre les noms propres avec Intellisense si le besoin s'en fait sentir.

+0

J'aimerais voir ce lien, mais il est mort – Joel

+0

@Joel: on dirait que le nouveau wiki est ici: https://github.com/jagregory/fluent-nhibernate/wiki/Conventions – RedGreenCode