Pregunta

En relación con mi otra pregunta dadas las siguientes clases y mapa fluidez, ¿hay alguna manera de conectar en cascada automáticamente eliminar una DriversLicense cuando se elimina la persona relacionada? Tenga en cuenta, no quiero la clase de persona a tener ningún conocimiento de la clase DriversLicense, pero también no quiero los datos huérfanos si una persona se elimina.

public class PersonMap : ClassMap<Person>
{
        public PersonMap() { Id( x => x.Id ); }
}

public class PersonMap : ClassMap<Person>
{
        public PersonMap() { Id( x => x.Id ); }
}

public class DriversLicense
{
        public virtual Person Person { get; set; }
        public virtual string State { get; set; }

        public override bool Equals( object obj ){ ... }
        public override int GetHashCode(){ ... }
}

public class DriversLicenseMap : ClassMap<DriversLicense>
{
        public DriversLicenseMap()
        {
                UseCompositeId().WithKeyReference( x => x.Person );
                Map( x => x.State );
        }
}
¿Fue útil?

Solución

Dado que no se puede suprimir algo en cascada DriversLicense a persona, por razones de negocios, y que realmente no lo que la persona saber sobre el DriversLicense y tiene un realmente buena razón para este requisito, entonces creo que podría manejar la situación de una de dos maneras:

  1. Mueva el cargo del cliente para eliminar el objeto DriversLicense más en su servicio o niveles de depósito y hacer lo que sugirió Chris. Consulta de objetos DriverLicnese de una persona y eliminarlos antes de eliminar la entidad persona.

  2. Se puede crear un interceptor Nhibernate o manejador de sucesos que realiza eliminaciones para usted. Este enfoque deja sus repositorios y dominio agradable y limpio y es probablemente el enfoque tomaría si no podía hacer referencia a la colección DriveLicenese de mi persona objeto. ( NHibernate Evento Documentación )

Otros consejos

No se puede hacer eso con la forma en que desea estructurar sus objetos. Si quería DriversLicense añadido a la clase Person se podía conectar en cascada eliminarlo. Pero, como ya se ha dicho que no quiere que el objeto persona tenga ningún conocimiento de la DriversLicense.

Lo que realmente necesita hacer es conseguir todos los permisos de conducir que contienen esa persona y luego eliminar los DriverLicenses con eliminación en cascada y que se retire el documento de persona y de la licencia.

(no he seguido muchos de los cambios en la FNH apilar recientemente, por lo que es posible que quedó rebautizado en algún momento) Es necesario para alterar su mapa a algo similar a:

public DriversLicenseMap()
{
        UseCompositeId().WithKeyReference( x => x.Person ).Cascade.All();
        Map( x => x.State );
}

Edit: Con la nueva información añade lo que realmente necesita hacer se fija en su clase de repositorio en el que maneje la supresión de una persona para ejecutar una búsqueda de todas las licencias de conducir que tienen esa persona. Lo más probable es que tendrá que escribir una expresión de criterios para manejar eso.

Después de obtener esa lista que desea borrar todos esos objetos y asegúrese de ahuyentar a esas eliminaciones, a continuación, eliminar el registro de la persona y el flujo al exterior.

Con la situación que explicó acerca de no querer datos huérfanos de la forma que desee limitado y no querer tener la licencia de conducir de clase dentro de la clase persona que no es posible manejar con cualquier tipo de borrado en cascada (que yo sepa. )

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top