2011-07-25 37 views
6

Tôi đã sử dụng NHibernate (với ánh xạ Fluent-NHibernate) trong một dự án lần đầu tiên trong vài tuần qua, tất cả đều diễn ra tốt đẹp cho đến hôm nay khi tôi gặp vấn đề (có thể là lỗi của chính tôi).NHibernate, "Trên Xóa Cascade", xếp hàng xóa các hàng trong các bảng có liên quan?

Tôi đã thực hiện một mẫu nhỏ để minh họa cho những gì tôi đang cố gắng để đạt được:

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

Trong ví dụ trên có nhiều hình ảnh, mỗi ngày một hình ảnh được chọn là một hình ảnh "đặc trưng", cùng một hình ảnh có thể được làm nổi bật nhiều lần. Hành vi tôi muốn là khi tôi xóa một ảnh bất kỳ mục Ảnh nổi bật nào tham chiếu đến ID hình ảnh đó sẽ tự động bị xóa. Tuy nhiên, vào lúc này nếu tôi cố gắng xóa một hình ảnh mà đã được đặc trưng nó ném một lỗi:

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

Nếu Nếu tự thêm "ON DELETE CASCADE" vào id hình ràng buộc khoá ngoại hoạt động:

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

... nhưng tôi không chắc liệu đây có phải là cách được khuyến nghị để thực hiện việc này không? Nếu bất cứ ai có thể tư vấn cho cách tốt nhất để đạt được điều này nó sẽ được đánh giá rất nhiều! Cảm ơn trước.

Trả lời

5

.Cascade.Delete() bạn đã thêm ở phía bên trái của mối quan hệ và nó thực sự sẽ khiến Hình ảnh bị xóa khi bạn xóa một hình ảnh nổi bật.

Những gì bạn muốn làm có thể được thực hiện bằng cách tạo tập hợp Ảnh nổi bật trong ảnh, ánh xạ nó như một túi nghịch đảo bằng cách xóa tầng trong khóa.

Tôi không sử dụng Thông thạo, nhưng trong XML bạn đặt on-delete="cascade" trong phần tử bộ sưu tập <key>; tìm một cái gì đó tương tự.

+0

Cảm ơn! Tôi đã xóa '.Cascade.Delete()' khỏi FeaturedImageMap và thêm 'HasMany (x => x.Featured) .Inverse(). ForeignKeyCascadeOnDelete(). KeyColumn (" Image_id ");' vào ImageMap. Dường như làm việc hoàn hảo ngay bây giờ. –

Các vấn đề liên quan