Đối với một ứng dụng sử dụng Mã Đầu tiên EF 5 beta Tôi có:EF có thể tự động xóa dữ liệu bị mồ côi, nơi cha mẹ không bị xóa không?
public class ParentObject
{
public int Id {get; set;}
public virtual List<ChildObject> ChildObjects {get; set;}
//Other members
}
và
public class ChildObject
{
public int Id {get; set;}
public int ParentObjectId {get; set;}
//Other members
}
Các hoạt động CRUD liên quan được thực hiện bởi các kho, khi cần thiết.
Trong
OnModelCreating(DbModelBuilder modelBuilder)
tôi đã thiết lập chúng:
modelBuilder.Entity<ParentObject>().HasMany(p => p.ChildObjects)
.WithOptional()
.HasForeignKey(c => c.ParentObjectId)
.WillCascadeOnDelete();
Vì vậy, nếu một ParentObject
bị xóa, ChildObjects của nó quá.
Tuy nhiên, nếu tôi chạy:
parentObject.ChildObjects.Clear();
_parentObjectRepository.SaveChanges(); //this repository uses the context
tôi nhận được ngoại lệ:
Thao tác thất bại: Mối quan hệ không thể được thay đổi bởi vì một hoặc nhiều trong những tài sản nước ngoài quan trọng là không -nullable. Khi thay đổi được thực hiện cho mối quan hệ, thuộc tính khóa ngoài có liên quan được đặt thành giá trị null. Nếu khóa ngoài không hỗ trợ giá trị null, một mối quan hệ mới phải được xác định, thuộc tính khóa ngoài phải được gán một giá trị không null khác, hoặc đối tượng không liên quan phải bị xóa.
Điều này có ý nghĩa vì định nghĩa của các thực thể bao gồm ràng buộc khóa ngoài bị hỏng.
Tôi có thể định cấu hình thực thể để "tự xóa" khi bị mồ côi hoặc tôi phải xóa thủ công các ChildObject
từ ngữ cảnh này (trong trường hợp này sử dụng ChildObjectRepository).
Rất may, nhóm EF [biết về điều này] (http://blog.oneunicorn.com/2012/06/02/deleting-orphans-with-entity-framework/) và có thể sẽ xuất hiện một giải pháp tích hợp mà không yêu cầu sửa đổi nội bộ – PinnyM