5

Nếu tôi có một lớp User có các đặc tính này:EF Mã Thứ nhất, bản đồ hai thuộc tính điều hướng để loại cùng một đối tượng

public Guid UserPreferenceId { get; set; } 
    public virtual DefaultUserPreference UserPreference { get; set; } 

    public Guid SecondaryUserPreferenceId { get; set; } 
    public virtual DefaultUserPreference SecondaryUserPreference { get; set; } 

Làm thế nào tôi có thể có được điều này để làm cho qua API thông thạo? Khi tôi cố gắng chạy điều này, nó nói:

Giới thiệu ràng buộc KEY NGOÀI trên bảng 'Người dùng' có thể gây ra chu kỳ hoặc nhiều tuyến đường xếp tầng. Chỉ định ON DELETE NO ACTION hoặc ON UPDATE NO ACTION, hoặc sửa đổi các ràng buộc KEY NGOẠI HỐI khác. Không thể tạo ràng buộc. Xem các lỗi trước đó.

Tôi đã nhìn thấy một vài trong số các câu hỏi này nhưng chúng luôn liên quan đến một thuộc tính điều hướng duy nhất và một bộ sưu tập. Ngoài ra mối quan hệ là một chiều, nhưng nó có thể là hai chiều nếu nó đã được, không chắc chắn nếu đó là vấn đề.

Trả lời

5

Khuôn khổ thực thể tạo mối quan hệ với Cascade Xóa theo mặc định. Việc tạo hai mối quan hệ từ một thực thể đến một kiểu khác cố gắng tạo ra hai mối quan hệ xóa tầng, mà cơ sở dữ liệu sẽ ném ra lỗi mà bạn đã thấy.

Sử dụng Code-First thạo cấu hình để loại bỏ các Cascade Delete trên một hoặc cả hai mối quan hệ:

modelBuilder.Entity<User>() 
    .HasOptional(u => u.UserPreference) 
    .WithMany() 
    .WillCascadeOnDelete(false); 
modelBuilder.Entity<User>() 
    .HasOptional(u => u.SecondaryUserPreference) 
    .WithMany() 
    .WillCascadeOnDelete(false); 
+0

Được rồi vì vậy tôi phải làm cho nó hai chiều sau đó? – SventoryMang

+0

Không, cập nhật câu trả lời bằng câu trả lời mà không hoạt động hai chiều. Bạn chỉ cần thay đổi dòng cấu hình thông thạo để phù hợp với những gì bạn muốn. – Richard

+0

Điều đó gây ra: Xung đột đa dạng với ràng buộc tham chiếu trong Vai trò 'DefaultUser_DefaultUserPreference_Target' trong mối quan hệ 'DefaultUser_DefaultUserPreference'. Vì tất cả các thuộc tính trong Vai trò phụ thuộc đều không có giá trị, nên tính đa dạng của Vai trò chính phải là '1'. Nó đã "làm việc" (không ném một lỗi) khi tôi thực hiện nó hai chiều nhưng SecondaryUserPreferenceId đã không được đặt thành một khóa FK. – SventoryMang

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