isessionfactory fluently fluent-nhibernate automapping

fluent-nhibernate - fluently - nhibernate fluent mapping



Cascade Guarda con Fluido NHibernate AutoMapping (5)

Actualizado para usar con 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(); } }

¿Cómo "enciendo" los saltos en cascada utilizando el AutoMap Persistence Model with Fluent NHibernate?

Como en:

Salvo a la persona y el brazo también debe ser salvado. Actualmente me sale

"el objeto hace referencia a una instancia transitoria no guardada: guarde la instancia transitoria antes de vaciar"

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

Encontré un artículo sobre este tema , pero parece estar desactualizado.


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(); } }


La forma más fácil que he encontrado para hacer esto en un proyecto completo es usar DefaultCascade :

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

Vaya a la sección "Las convenciones más simples" 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 advertencia: algunos de los nombres de los métodos en el Wiki pueden estar equivocados. Edité el Wiki con lo que pude verificar (es decir, DefaultCascade y DefaultLazy), pero no puedo responder por el resto. Pero debería poder averiguar los nombres adecuados con Intellisense si surge la necesidad.


Las Firmas del Método de la Convención han cambiado. Para la nueva respuesta que hace exactamente lo que esta pregunta pregunta, vea ESTA PREGUNTA .


También puede hacer que la convención predeterminada en cascada 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(); });