2011-07-25 13 views
6

He estado utilizando NHibernate (con mapeos Fluent-NHibernate) en un proyecto por primera vez en las últimas semanas, todo iba bien hasta hoy cuando he topado con un problema (muy probablemente mi propio error).NHibernate, "On Delete Cascade", elimina en cascada las filas en tablas relacionadas?

He hecho una pequeña muestra para ilustrar lo que estoy tratando de lograr:

public class Image 
{ 
    public virtual int Id { get; set; } 
    public virtual string Name { get; set; } 
    public virtual string Path { get; set; } 
} 

public class FeaturedImage 
{ 
    public virtual int Id { get; set; } 
    public virtual Image Image { get; set; } 
    public virtual string Description { get; set; } 
    public virtual DateTime Date { get; set; } 
} 

public class ImageMap : ClassMap<Image> 
{ 
    public ImageMap() 
    { 
     Id(x => x.Id).GeneratedBy.Identity().UnsavedValue(0); 
     Map(x => x.Name); 
     Map(x => x.Path); 
    } 
} 

public class FeaturedImageMap : ClassMap<FeaturedImage> 
{ 
    public FeaturedImageMap() 
    { 
     Id(x => x.Id).GeneratedBy.Identity().UnsavedValue(0); 
     Map(x => x.Description); 
     Map(x => x.Date); 
     References(x => x.Image).Not.Nullable().Cascade.Delete(); 
    } 
} 

En el ejemplo anterior hay varias imágenes, la imagen cada día es recogido como una imagen "aparecido", la misma imagen puede presentarse varias veces. El comportamiento que me gustaría es que cuando elimine una imagen, todas las entradas FeaturedImage que hacen referencia a esa ID de imagen se eliminen automáticamente. Sin embargo, por el momento si trato de borrar una imagen que ha sido presentado arroja un error:

The DELETE statement conflicted with the REFERENCE constraint "FKF42D8269692640D". Conflict table "dbo.FeaturedImage", column 'Image_id'.

Si Si agregar manualmente "ON DELETE CASCADE" a la restricción de clave externa imagen Identificación funciona:

alter table [FeaturedImage] 
add constraint FKF42D8269692640D foreign key (Image_id) references [Image] ON DELETE CASCADE 

... pero no estoy seguro de si esta es la forma recomendada de hacer esto? ¡Si alguien pudiera aconsejar la mejor manera de lograr esto, sería muy apreciado! Gracias por adelantado.

Respuesta

5

El .Cascade.Delete() que ha agregado está en el lado incorrecto de la relación, y en realidad haría que la Imagen se elimine cuando elimine una Imagen destacada.

Lo que desea hacer se puede lograr creando una colección de FeaturedImage en la imagen, asignarla como una bolsa inversa con eliminación de cascada en la clave.

No uso Fluent, pero en XML estableces on-delete="cascade" en el elemento de la colección <key>; busca algo similar.

+0

Gracias! Eliminé '.Cascade.Delete()' del FeaturedImageMap y agregué 'HasMany (x => x.Featured) .Inverse(). ForeignKeyCascadeOnDelete(). KeyColumn (" Image_id ");' al ImageMap. Parece estar funcionando perfectamente ahora. –

Cuestiones relacionadas