2011-07-25 18 views
6

NHibernate'i (Fluent-NHibernate eşleştirmeleriyle) son bir kaç hafta içinde ilk defa bir projede kullanıyorum, bir sorunla karşılaştığım güne kadar hepsi iyi gidiyordu (büyük ihtimalle kendi hatam).NHibernate, "On Delete Cascade", ilgili tablolardaki satırları silme çağlayanı mı?

ben başarmak için çalışıyorum göstermek için küçük bir örnek yaptık: Örnekte

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

yukarıda, her gün bir resim, bir "özellikli" görüntü olarak aldım alır Birden fazla resim var, Aynı görüntü birden çok kez gösterilebilir. İstediğim davranış, resim kimliğinin otomatik olarak silinmesini belirten herhangi bir FeaturedImage girişini silmemdir.

:

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

el ile çalıştığını görüntü kimliği yabancı anahtar kısıtlaması için "SİL ÇORUH AÇIK" eklerseniz: Ancak şu anda bunun bir hata atar yer almıştır Görüntü silmeye çalışırsanız

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

... ama bunu yapmanın önerilen yolu olup olmadığından emin değilim? Herkes bunu başarmanın en iyi yolunu önerebilirse, çok takdir edilecektir! Şimdiden teşekkürler.

cevap

5

Eklediğiniz .Cascade.Delete(), ilişkinin yanlış tarafındadır ve bir FeaturedImage öğesini sildiğinizde, resmin silinmesine neden olur.

Yapmak istediğiniz şey, Image'deki bir FeaturedImage koleksiyonu oluşturarak, anahtarda kaskad-silme ile ters bir çanta olarak eşleştirerek gerçekleştirilebilir.

Ben Fluent kullanmıyorum, ancak XML'de <key> öğesinin koleksiyonunda on-delete="cascade"'u; benzer bir şey arayın.

+0

Teşekkürler! FeaturedImageMap dosyasından '.Cascade.Delete()' yi sildim ve 'HasMany (x => x.Featured) .Inverse(). ForeignKeyCascadeOnDelete(). KeyColumn (" Image_id ");' ImageMap'e ekledim. Şimdi mükemmel çalışıyor gibi görünüyor. –

İlgili konular