2013-09-22 44 views
11

Làm cách nào để ánh xạ mối quan hệ sau trong Khung thực thể 5?Khuôn khổ thực thể 5 Mã mối quan hệ tự tham chiếu đầu tiên

public class Item { 
    public int Id { get; set; } 
    public int? ParentItemId { get; set; } 
    public string Value { get; set; } 

    public Item ParentItem { get; set; } 
    public List<Item> ChildItems { get; set; } 
} 

Tôi đã thử điều này:

protected override void OnModelCreating(DbModelBuilder modelBuilder) { 
    base.OnModelCreating(modelBuilder); 

    modelBuilder.Entity<Item>() 
       .HasOptional(i => i.ParentItem) 
       .WithMany(i => i.ChildItems) 
       .HasForeignKey(i => i.ParentItemId); 
} 

và điều này:

protected override void OnModelCreating(DbModelBuilder modelBuilder) { 
    base.OnModelCreating(modelBuilder); 

    modelBuilder.Entity<Item>() 
       .HasMany(i => i.ChildItems) 
       .WithOptional(i => i.ParentItem) 
       .HasForeignKey(i => i.ParentItemId); 
} 

mà cả hai kết quả trong lỗi này:

Các loại tất cả các thuộc tính trong phụ thuộc Vai trò của ràng buộc tham chiếu phải giống như các loại thuộc tính tương ứng trong Pri ncipal Vai trò.

Nếu tôi bắt đầu với bản đồ cơ sở dữ liệu đầu tiên, đây là những gì các thực thể được tạo ra trông giống như:

public partial class Item 
{ 
    public Item() 
    { 
     this.ChildItems = new HashSet<Item>(); 
    } 

    public int Id { get; set; } 
    public Nullable<int> ParentItemId { get; set; } 
    public string Value { get; set; } 

    public virtual ICollection<Item> ChildItems { get; set; } 
    public virtual Item ParentItem { get; set; } 
} 

Tôi biết điều này sẽ làm việc nếu tôi bắt đầu với db-đầu tiên, tôi chỉ cần biết làm thế nào để xác định mối quan hệ trong mã đầu tiên.

+0

là 'Id' key property? Hay bạn có ánh xạ khóa (với Fluent API?) Đến một thuộc tính khác, ví dụ như 'Giá trị'? – Slauma

+0

Id là thuộc tính khóa chính của Mục. – user326502

+0

"* loại của tất cả các thuộc tính trong Vai trò phụ thuộc *" có nghĩa là các loại thuộc tính FK là 'ParentItemId' và có kiểu' int? '. "* các loại thuộc tính tương ứng trong Vai trò chính *" có nghĩa là các loại thuộc tính PK là 'Id' và có kiểu' int'. Họ là như nhau (nullability không quan trọng). Tuy nhiên, ngoại lệ cho biết, họ không. Ngoại lệ sẽ xảy ra nếu bạn có một ví dụ 'long' (hoặc bất kỳ loại nào khác) cho PK và một' int? 'Cho FK. Khá lạ ... – Slauma

Trả lời

2

Trường hợp ngoại lệ có nghĩa như sau:

  • "loại tất cả các thuộc tính trong vai trò phụ thuộc" là các loại tài sản FK đó là ParentItemId và có kiểu int? trong mô hình của bạn
  • "các loại thuộc tính tương ứng trong Vai trò chính "là các loại thuộc tính PK là Id và có loại int trong mô hình của bạn

Chúng giống nhau (tính vô hiệu không quan trọng). Tuy nhiên, ngoại lệ cho biết, họ không.

Ngoại lệ thông thường sẽ chỉ xảy ra nếu loại không khớp, ví dụ: nếu bạn có long (hoặc bất kỳ loại nào khác) cho PK và int? cho FK.

0

Hãy thử sử dụng cách tạo bản đồKey thay vì sử dụng HasForeignKey. Giống như

modelBuilder.Entity<Course>() 
    .HasRequired(c => c.Department) 
    .WithMany(t => t.Courses) 
    .Map(m => m.MapKey("ChangedDepartmentID")); 
+0

Cảm ơn bạn đã dành thời gian trả lời. Khi cố gắng theo cách này, tôi nhận được lỗi sau: Mỗi tên thuộc tính trong một loại phải là duy nhất. Tên thuộc tính 'ParentItemId' đã được xác định. – user326502

+0

Thêm bỏ qua đối với thuộc tính ParentItemId ngay trước khi ánh xạ nhiều đến một bên trên .. modelBuilder.Entity () .Ignore (it => it.ParentItemId); –

7

Trong mã đầu tiên thay đổi lớp thực thể của bạn như thế này:

public class Item 
    { 
     public Item() 
     { 
      this.ChildItems = new HashSet<Item>(); 
     } 

     public int Id { get; set; } 
     public Nullable<int> ParentItemId { get; set; } 
     public string Value { get; set; } 

     public virtual Item ParentItem { get; set; } 
     public virtual ICollection<Item> ChildItems { get; set; } 
    } 

Viết đoạn mã sau vào tập tin ngữ cảnh của bạn:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<Item>() 
        .HasOptional(i => i.ParentItem) 
        .WithMany(i => i.ChildItems) 
        .HasForeignKey(i => i.ParentItemId); 
    } 

suy nghĩ này nên làm việc.

+0

Cảm ơn bạn đã dành thời gian trả lời. Khi cố gắng theo cách này, tôi vẫn nhận được cùng một lỗi: Các loại thuộc tính trong Vai trò phụ thuộc của ràng buộc tham chiếu phải giống như các loại thuộc tính tương ứng trong Vai trò chính. – user326502

3

Tại sao không thử loại này:

public class Item 
    { 
     public Item() 
     { 
      ChildItems = new HashSet<Item>(); 
     } 

     public int Id { get; set; } 
     public int? ParentItemId { get; set; } 
     public string Value { get; set; } 

     public virtual Item ParentItem { get; set; } 
     public virtual ICollection<Item> ChildItems { get; set; } 
    } 

Và trong DataContex Lớp của bạn:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<Item>() 
        .HasOptional(i => i.ParentItem) 
        .WithMany() 
        .HasForeignKey(i => i.ParentItemId); 
    } 

Hope công việc này.

Cũng có một bài viết tốt ở đây: Làm thế nào để cấu hình một tự Việc tra cứu Cơ quan có thẩm Mã Đầu tiên http://blogs.microsoft.co.il/gilf/2011/06/03/how-to-configure-a-self-referencing-entity-in-code-first/

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