2013-03-06 24 views
9

Tôi đang sử dụng EF với mã đầu tiên và TPT (Bảng cho mỗi loại) thừa kế. Tôi có mô hình sau:Làm thế nào để cho phép xóa tầng trong di sản TPT (bảng cho mỗi loại) trong mã đầu tiên?

public partial class AccountHolder 
{ 
    public int AccountHolderId { get; set; } 

    public virtual Address Detail { get; set; } 
    public virtual Nominee Nominee { get; set; } 
} 

public partial class Nominee 
{ 
    public int NomineeId { get; set; }    
} 

public abstract class Address 
{ 
    public int AddressId { get; set; } 
    ... 
} 

public class PersonalDetail : Address 
{ 
    public int PersonalDetailId { get; set; } 
    ... 
} 

thạo api:

 modelBuilder.Entity<AccountHolder>().HasOptional(p => p.Nominee) 
              .WithRequired() 
              .WillCascadeOnDelete(); 

Theo this tutorial đây là một mối quan hệ đa hình giữa giữ sổ và địa chỉ. PersonalDetail kế thừa Địa chỉ. Vấn đề của tôi là bất cứ khi nào tôi xóa bất kỳ AccountHolder nào tôi muốn EF sẽ chăm sóc xóa thông tin PersonalDetail liên quan của nó từ bảng Address và PersonalDetail nhưng hiện tại thì không vui, ai cũng có thể hướng dẫn tôi cách thực hiện hành vi này thông qua API thông thạo tiếp cận ?

Edit:

Theo câu trả lời posted khi tôi đang sử dụng cấu hình này:

 modelBuilder.Entity<AccountHolder>().HasOptional(p => p.Detail) 
              .WithRequired() 
              .WillCascadeOnDelete(); 

cho phép cascade xóa rằng điều này mâu thuẫn với 1-1 mối liên hệ giữa giữ sổ và đề cử hiện có. Trường hợp ngoại lệ là:

Đã phát hiện các thay đổi xung đột. Điều này có thể xảy ra khi cố gắng chèn nhiều thực thể với cùng một khóa.

Trả lời

1

Kiểm tra chức năng WillCascadeOnDelete khi xác định EntityTypeConfiguration

http://msdn.microsoft.com/en-us/library/gg679348(v=vs.103).aspx

Trong ví dụ mà bạn đăng trong câu hỏi, họ có:

modelBuilder.Entity<Customer>() 
       .HasOptional(c => c.BillingAddress) 
       .WithRequired(); 

Slap một WillCascadeOnDelete (true) tại kết thúc của điều đó (hoặc cho bất kỳ thực thể nào bạn muốn có thác), và điều đó nên làm điều đó. Một cái gì đó như:

modelBuilder.Entity<AccountHolder>().HasOptional(a => a.Address).WithRequired().WillCascadeOnDelete(true); 
+0

Tôi đã có mối quan hệ 1 đến 1 giữa 'AccountHolder và OtherTable' với cùng cấu hình mà bạn đề xuất sao cho khi tôi thêm cấu hình mà bạn đề xuất hơn nó cho tôi thấy một ngoại lệ' Xung đột thay đổi được phát hiện. Điều này có thể xảy ra khi cố gắng chèn nhiều thực thể với cùng một khóa.' Xin lỗi vì không đề cập đến điều này trong câu hỏi của tôi, tôi cập nhật câu hỏi của mình. – gaurav

+0

Những người khác đã chạy vào điều này cũng như với TPT thừa kế. Xem http://stackoverflow.com/questions/9064273/cascade-delete-in-entity-framework-table-per-type-inheritance, có vẻ như có lỗi/tính năng khiến việc xóa một chút lông, nhưng có thể. Ngoài ra, mỗi mối quan hệ nên được cấu hình giống như ví dụ tôi đã đăng ở trên, chỉ để chắc chắn rằng chúng xếp (càng nhiều càng tốt, với lỗi/tính năng được giải thích trong liên kết đó) –

+0

yaa tôi đã kiểm tra bài này nhưng trong trường hợp của tôi bằng cách nào đó hồ sơ không xóa ngay cả từ bảng PersonalDetail (bảng dẫn xuất) – gaurav

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