2011-12-01 12 views
5

Soy nuevo en Fluent nHibernate y me gustaría saber, si tengo dos clases Perfil y Correo electrónico mapeados de uno a muchos como sigue ... Quiero definir un mapeo nHibernate con fluidez para que cuando se elimine el Perfil, el correo electrónico permanezca en el DB, con una clave establecida en Nulo. O en otras palabras, tener "ON DELETE SET NULL"¿Cómo establecer la opción "eliminar cascada" en "Establecer nulo" en Fluidez NHibernate?

ALTER TABLE [dbo].[Email] WITH CHECK ADD CONSTRAINT [FK4239B252F6539048] FOREIGN KEY([ProfileId]) 
REFERENCES [dbo].[Profile] ([Id]) 
ON UPDATE SET NULL 
ON DELETE SET NULL 

¡Cualquier ayuda es muy apreciada!

public sealed class ProfileMapping : ClassMap<Profile> 
     { 
      public ProfileMapping() 
      { 
       // Some other fields here ... 
       HasMany(x => x.Emails); 
      } 
     } 

    public class EmailMapping : ClassMap<Email> 
    { 
     public EmailMapping() 
     { 
      Id(x => x.Id).GeneratedBy.GuidComb(); 
      Map(x => x.Address).Not.Nullable().UniqueKey("UX_EmailAddress").Length(254); 
      Map(x => x.Confirmed); 
     } 
    } 

Respuesta

7

No podrá especificar este comportamiento automáticamente en Fluent NHibernate AFAIK. Aunque el ON DELETE/sobre el comportamiento de actualización de la especificación es común a todos los DBs que NHibernate apoya, control de NH/HNF en cascada con niveles específicos de comportamiento en cascada:

none - do not do any cascades, let the users handles them by themselves. 
save-update - when the object is saved/updated, check the assoications and save/update any object that require it (including save/update the assoications in many-to-many scenario). 
delete - when the object is deleted, delete all the objects in the assoication. 
delete-orphan - when the object is deleted, delete all the objects in the assoication. In addition to that, when an object is removed from the assoication and not assoicated with another object (orphaned), also delete it. 
all - when an object is save/update/delete, check the assoications and save/update/delete all the objects found. 
all-delete-orphan - when an object is save/update/delete, check the assoications and save/update/delete all the objects found. In additional to that, when an object is removed from the assoication and not assoicated with another object (orphaned), also delete it. 

Como se puede ver, "SET NULL" no es una de los comportamientos de cascada disponibles.

Lo mejor que puede hacer en este caso es no conectar en cascada y definir la relación como "inversa" (los correos electrónicos "controlan" el perfil al que pertenecen; los perfiles no son "propietarios" de su E -correos como tales), e implementar lógica en su repositorio o adjunta a la sesión NHibernate que eliminará todas las referencias de los correos electrónicos secundarios a su perfil principal, luego guarde todos los hijos como registros "huérfanos" antes de eliminar el perfil.

+0

Eso es lo que pensé ... ¡Muchas gracias! –

Cuestiones relacionadas