2015-03-02 11 views
6

Tôi đang thực hiện một Remove() sử dụng Entity Framework. Khi tôi cố gắng chạy SaveChanges(), tôi được thông báo rằng tôi không thể chèn NULL vào một cột không cho phép nó. Đây là xa lạ với tôi, vì tôi không làm bất kỳ INSERT, và tôi đã kiểm tra mỗi trong số 30 mục hiện có để thấy rằng nó không cần phải cố gắng để lưu bảng với null trong cột đó.không thể chèn NULL vào cột vào Remove

Đây là mã trong câu hỏi:

var user = db.AspNetUsers.FirstOrDefault(u => u.Id == userId); 
if (user != null) 
{ 
    var itemsToRemove = user.ItemXrefs.Where(i => !itemIDs.Contains(i.ItemID)).ToList(); 

    foreach (var xref in itemsToRemove) 
    { 
     user.ItemXrefs.Remove(xref); 
    } 

    db.SaveChanges(); 
    //... 
} 
+0

bạn có thể cung cấp ngoại trừ thực tế và các lớp POCO tham gia? Lỗi xảy ra trên thực thể đang bị xóa khỏi hoặc một thực thể liên quan? – Kritner

+0

Có một chút rắc rối khi bạn đang truy vấn 'user.ItemXfefs' và sau đó xóa kết quả khỏi' user.Items'. Bạn có nên xóa các mục khỏi cùng một bộ sưu tập mà bạn đang truy vấn chúng không? Hoặc ít nhất là xác minh rằng 'user.Items' chứa mục bạn đang xóa? –

+0

@RufusL Đó là một sai lầm khi đơn giản hóa mã của tôi cho câu hỏi này - đã sửa nó. – muttley91

Trả lời

5

Hãy thử điều này thay vì:

itemXrefSet = db.Set<ItemXref>(); 
foreach (var xref in itemsToRemove) 
{ 
    itemXrefSet.Remove(xref); 
} 
db.SaveChanges(); 

này nên xóa các-tham khảo chéo thực thể từ bảng gerund cũng như mối quan hệ giữa hai thực thể nó liên kết với nhau.

Lý do bạn chạy vào một lỗi theo cách bạn cố gắng để làm điều đó là vì EntityFramework nghĩ rằng bạn chỉ muốn loại bỏ các mối quan hệ mà không cần tháo đơn vị có liên quan. Khi EF thực hiện điều này, nó sẽ cố gắng thiết lập cột khóa ngoài trong bảng phụ thuộc thành NULL. Cách xung quanh việc này là liên kết hàng bảng với người dùng khác bằng cách thay đổi giá trị cột UserId hoặc xóa hàng của bảng vì bạn không thể đặt giá trị cột bắt buộc thành NULL.

+0

Cảm ơn, điều đó đã làm được! – muttley91

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