2011-07-25 77 views
6

我在過去幾周內第一次在一個項目中使用NHibernate(與Fluent-NHibernate映射),直到今天我遇到了問題(很可能是我自己的錯誤),一切都很順利。NHibernate,「在刪除級聯」,級聯刪除相關表中的行?

我做了一個小樣本,說明我想要實現:

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

在上面的例子中有多個圖片,每天一個形象得到回升爲「特色」的形象,相同的圖像可以多次顯示。我想要的行爲是當我刪除圖像時,任何引用該圖像ID的FeaturedImage條目都會自動被刪除。然而,此刻,如果我嘗試刪除它已收錄它拋出一個錯誤的圖片:

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

如果如果手動添加「ON DELETE CASCADE」,以它的工作原理的圖像ID外鍵約束:

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

...但我不確定這是否是推薦的方式?如果任何人可以建議實現這一點的最佳方式,將不勝感激!提前致謝。

回答

5

您添加的.Cascade.Delete()位於關係的錯誤一方,並且實際上會導致在您刪除FeaturedImage時刪除圖像。

你想要做的事情可以通過在Image中創建一個FeaturedImage集合來完成,將它映射爲一個在包含key級聯中刪除的反包。

我不使用Fluent,但是在XML中您設置了on-delete="cascade"中的<key>元素;尋找類似的東西。

+0

謝謝!我從FeaturedImageMap中刪除了'.Cascade.Delete()'並向ImageMap添加了'HasMany(x => x.Featured).Inverse()。ForeignKeyCascadeOnDelete()。KeyColumn(「Image_id」);似乎現在正在完美工作。 –