2017-10-02 13 views
5

Tôi cần biết về cách vô hiệu hóa xóa tầng trong EF Core 2 trên toàn cầu. Bất kỳ trợ giúp nào đều được yêu cầu.Vô hiệu hóa xóa bỏ tầng trên EF Core 2 trên toàn cầu

Trong EF 6.x chúng tôi đã sử dụng mã sau đây để vô hiệu hóa cascade xóa trên cả OneToManyManyToMany realtions:

builder.Conventions.Remove<OneToManyCascadeDeleteConvention>(); 
builder.Conventions.Remove<ManyToManyCascadeDeleteConvention>(); 

Trả lời

9

Thật không may EF cốt lõi hiện nay (mới nhất vào thời điểm này v2.0) không phơi bày một cách tốt để kiểm soát các quy ước trên toàn cầu.

Quy ước EF Core 2.0 mặc định là sử dụng DeleteBehavior.Restrict cho các yêu cầu và DeleteBehavior.ClientSetNull cho các mối quan hệ tùy chọn. Những gì tôi có thể đề xuất như giải pháp thay thế là vòng lặp mô hình siêu dữ liệu điển hình ở cuối ghi đè OnModelCreating. Trong trường hợp này, xác định tất cả các mối quan hệ đã được phát hiện và sửa đổi chúng cho phù hợp:

protected override void OnModelCreating(ModelBuilder modelBuilder) 
{ 
    // ... 

    var cascadeFKs = modelBuilder.Model.GetEntityTypes() 
     .SelectMany(t => t.GetForeignKeys()) 
     .Where(fk => !fk.IsOwnership && fk.DeleteBehavior == DeleteBehavior.Cascade); 

    foreach (var fk in cascadeFKs) 
     fk.DeleteBehavior = DeleteBehavior.Restrict; 

    base.OnModelCreating(modelBuilder); 
} 
+0

Cảm ơn bạn đã trả lời. 'CascadeFKs' ở đây chỉ chứa các quan hệ 'một-nhiều' hay nó cũng bao gồm các quan hệ 'nhiều-nhiều'? –

+1

Hiện tại không có mối quan hệ 'nhiều-với-nhiều 'đặc biệt nào trong EFC (chúng được mô phỏng với 2' một-nhiều). Vì vậy, để trả lời câu hỏi của bạn, 'cascadeFks' chứa tất cả các mối quan hệ -' một-nhiều và 'một-một. –

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