2013-06-22 17 views
13

"Kết thúc chính của liên kết này phải được định cấu hình rõ ràng bằng API thông thạo quan hệ hoặc chú thích dữ liệu".Kết thúc chính của liên kết này phải được định cấu hình rõ ràng bằng API quan hệ hoặc chú thích dữ liệu

Tôi nhận được lỗi này trong Entity Framework 4.4 khi cập nhật/di chuyển cơ sở dữ liệu, nhưng tôi không cố gắng xác định mối quan hệ 1: 1. Tôi muốn một cái gì đó như thế này:

public class EntityA 
{ 
    public int ID { get; set; } 
    public int EntityBID { get; set; } 

    [ForeignKey("EntityBID")] 
    public virtual EntityB EntityB { get; set; } 
} 

public class EntityB 
{ 
    public int ID { get; set; } 
    public Nullable<int> PreferredEntityAID { get; set; } 

    [ForeignKey("PreferredEntityAID")] 
    public virtual EntityA PreferredEntityA { get; set; } 
} 

nơi EntityA phải có cha mẹ EntityB, trong khi EntityB có thể có con EntityA ưu tiên, nhưng không phải. Đứa trẻ được ưu tiên nên là một trong những đứa trẻ được liên kết với phụ huynh, nhưng tôi không biết cách thực thi điều này trong cơ sở dữ liệu. Tôi đang lên kế hoạch thực thi nó theo chương trình.

Làm cách nào để khắc phục lỗi này hoặc cách tốt hơn để hoàn thành các mối quan hệ này là gì?

+1

'[ForeignKey ("EntityAID") ] 'có nghĩa là, phải có thuộc tính' EntityB.EntityAID'. Bạn đã bỏ lỡ nó trong một mẫu? – Dennis

+1

Bạn có nghĩa là [ForeignKey ("PreferredEntityAID")] không? – ChaseMedallion

+0

Cảm ơn bạn đã đánh bắt điều đó. Chỉ cần bỏ qua nó trong ví dụ của tôi. Tôi đã chỉnh sửa nó. – lintmouse

Trả lời

28

Quy tắc khung thực thể-Công ước đầu tiên giả định rằng EntityA.EntityBEntityB.PreferredEntityA thuộc về cùng một mối quan hệ và là thuộc tính điều hướng nghịch đảo của nhau. Bởi vì cả hai thuộc tính điều hướng là các tham chiếu (không phải các bộ sưu tập), EF truyền một mối quan hệ một-một.

Vì bạn thực sự muốn có hai mối quan hệ một-nhiều, bạn phải ghi đè lên các quy ước. Với mô hình của bạn nó chỉ có thể với API thạo:

modelBuilder.Entity<EntityA>() 
    .HasRequired(a => a.EntityB) 
    .WithMany() 
    .HasForeignKey(a => a.EntityBID); 

modelBuilder.Entity<EntityB>() 
    .HasOptional(b => b.PreferredEntityA) 
    .WithMany() 
    .HasForeignKey(b => b.PreferredEntityAID); 

(. Nếu bạn sử dụng này, bạn có thể loại bỏ các [ForeignKey] thuộc tính)

Bạn không thể chỉ định một ánh xạ đó sẽ đảm bảo rằng đứa trẻ ưa thích luôn là một trong những các đứa trẻ liên quan.

Nếu bạn không muốn sử dụng API thạo nhưng chỉ chú thích dữ liệu bạn có thể thêm một tài sản thu trong EntityB và liên hệ nó để EntityA.EntityB sử dụng [InverseProperty] thuộc tính:

public class EntityB 
{ 
    public int ID { get; set; } 
    public Nullable<int> PreferredEntityAID { get; set; } 

    [ForeignKey("PreferredEntityAID")] 
    public virtual EntityA PreferredEntityA { get; set; } 

    [InverseProperty("EntityB")] // <- Navigation property name in EntityA 
    public virtual ICollection<EntityA> EntityAs { get; set; } 
} 
+2

Điều đó đã làm điều đó. Cảm ơn. – lintmouse

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