2012-01-25 46 views
12

Tôi gặp vấn đề với việc xóa các hàng có liên quan trong Khuôn khổ thực thể 4.1. Tôi có bảng với quan hệKhuôn khổ thực thể trên xóa tầng

Book 1 < ---> * BookFormats

tôi đã thiết lập trên cascade delete: tài sản

ALTER TABLE [dbo].[BookFormats] WITH CHECK ADD CONSTRAINT [FK_BookFormats_Book] 
FOREIGN KEY([BookID]) REFERENCES [dbo].[Book] ([BookID]) on delete cascade 

Các EDMX

enter image description here

Sau đó, , Tôi muốn xóa tất cả các mục BokFormats có liên quan đến đối tượng Book của tôi:

var originalBook = m.db.Book.First(x => x.BookID == bookId); 
originalBook.BookFormats.Clear(); 
m.db.SaveChanges(); 

Nhưng, tôi nhận được lỗi:

The operation failed: The relationship could not be changed because one or more of the foreign-key properties is non-nullable. When a change is made to a relationship, the related foreign-key property is set to a null value. If the foreign-key does not support null values, a new relationship must be defined, the foreign-key property must be assigned another non-null value, or the unrelated object must be deleted.

Tôi chạy ra khỏi ý tưởng về làm thế nào để xóa các đối tượng này. Bất kỳ ý tưởng?

Trả lời

10

Cascade xóa khái niệm này là như sau:

Khi bạn xóa Book từ DB tất cả liên quan BookFormats sẽ bị xóa cho bạn bằng cách SQL Server (xin lưu ý rằng nó không quan trọng như thế nào xóa Book sẽ được bắt đầu qua EF hoặc SQL thô). Vì vậy, nó không có gì để làm với nhiệm vụ của bạn: "Tôi muốn xóa tất cả BookFormats liên quan đến Book của tôi". Để thực hiện nó, bạn cần một cái gì đó như thế này:

foreach(var m in m.db.BookFormats.Where(f=>f.BookID == bookID)) 
{ 
    m.db.BookFormats.Remove(m); 
} 
m.db.SaveChanges(); 
4

Bạn chưa xóa BookFormats từ cơ sở dữ liệu, nhưng bạn đang loại bỏ các mối quan hệ, do đó orpahning BookFormats của bạn và thiết lập cột BookID-NULL. Xóa tầng bạn đã đặt trên cơ sở dữ liệu nói When I delete the Sách , then delete all of the BookFormats that have a BookID equal to mine. Bạn không xóa sách bạn đang xóa các định dạng từ Book.

Thay vì originalBook.BookFormats.Clear() bạn nên có một cái gì đó như thế này ...

List<int> idsToDelete = new List<int>(); 

foreach (BookFormat bf in originalBook.BookFormats) 
{ 
    idsToDelete.Add(bf.ID); 
} 

foreach (int id in idsToDelete) 
{ 
    BookFormat format = m.db.BookFormat.FirstOrDefault(x => x.ID == id); 
    if (format != null) 
    { 
     m.db.DeleteBookFormat(format); 
    } 
} 

m.db.SaveChanges(); 

Nó phải là một cái gì đó dọc theo những đường. Tôi không có nó ngay trước mặt tôi để nhớ cách EF xây dựng phương thức xóa trong EDMX.

+0

tốt sau đó tôi nhận được lỗi: Bộ sưu tập đã được sửa đổi; hoạt động điều tra có thể không thực hiện được. – Tony

+0

@Tony, kiểm tra thay đổi mã. Không phải là cách đẹp nhất, nhưng hoàn thành công việc. – bdparrish

14

Bạn có thể sử dụng RemoveRange:

m.db.BookFormats.RemoveRange(originalBook.BookFormats); 
m.db.SaveChanges(); 

Nhưng điều này là dành cho EF 6.0

+1

Đúng. Đó là ví dụ về RemoveRange.Nhưng tôi sẽ chỉnh sửa bài viết để không nhầm lẫn một số. Cảm ơn. – Saykor

0

tôi sử dụng EF6 và các công trình này.

 var itemBinding = db.ItemBinding.Where(x => x.BindingToId == id) ; 
     foreach (var ib in itemBinding) 
     { 
      db.Item.Remove(ib.Item); 
      db.ItemBinding.Remove(ib); 
     } 
     db.SaveChanges(); 
+0

EF 7 chưa được phát hành. EF 6.1 là phiên bản ổn định mới nhất. – MEMark

0

Tôi đã thử nghiệm nó trong EF 6.1.3 và điều này sẽ làm việc tốt:

var originalBook = m.db.Book.First(x => x.BookID == bookId); 
originalBook.BookFormats.Clear(); 
db.Books.Remove(originalBook); 
m.db.SaveChanges(); 
Các vấn đề liên quan