2009-02-25 12 views
21

¿Cómo "enciendo" guarda en cascada usando AutoMap Persistence Model con Fluidez NHibernate?Cascade Saves con NHibernate AutoMapping Fluent

Como en:

que salvar a la persona y el Brazo también sería salvo. Actualmente recibo

"objeto referencia a una instancia transitoria no salva - guardar la instancia transitoria antes de lavar"

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

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

He encontrado an article on this topic, pero parece ser obsoleta.

+0

¿Esto se haría usando una convención? –

Respuesta

13

Esto funciona con los nuevos bits de configuración. Para obtener más información, consulte 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

Gracias por la actualización. –

+0

Gracias. De hecho, utilicé Kristoffers ejemplo más corto, pero estoy seguro de que este también funciona –

1

También puede hacer que la cascada sea la convención predeterminada para todos los tipos. Por ejemplo (utilizando el artículo al que enlazó como punto de partida):

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

El método de la convención Las firmas han cambiado. Para la nueva respuesta que hace exactamente lo que esta pregunta pregunta, vea THIS QUESTION.

13

actualizada para su uso con el de la versión actual:

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

Para "public void Apply (instancia IOneToManyCollectionInstance) ", también me parece útil tener "instance.inverse();" además de "instance.Cascade.All()". – Antony

+0

Gracias este código funcionó para mí. –

+0

@Antony Lo inverso me funcionó. ¡Gracias! –

4

La manera más fácil que he encontrado para hacer esto durante todo un proyecto es utilizar DefaultCascade:

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

Ir a "The Simplest Conventions" sección en la wiki, para esto, y una lista de otras.

Aquí está la lista de la 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") 

Una palabra de advertencia - algunos de los nombres de los métodos de la wiki puede ser incorrecto. Edité el Wiki con lo que pude verificar (es decir, DefaultCascade y DefaultLazy), pero no puedo responder por el resto. Pero deberías poder descifrar los nombres propios con Intellisense si surge la necesidad.

+0

Me encantaría ver ese enlace, pero está muerto – Joel

+0

@Joel: parece que el nuevo wiki está aquí: https://github.com/jagregory/fluent-nhibernate/wiki/Conventions – RedGreenCode

Cuestiones relacionadas