2016-09-30 19 views
9

Hãy nói rằng tôi có 2 mô hình sau đây:EF lõi one-to-nhiều mối quan hệ HasOne() WithMany() vs HasMany() WithOne()

public class Blog 
{ 
    public int BlogId { get; set; } 
    public string Url { get; set; } 

    public List<Post> Posts { get; set; } 
} 

public class Post 
{ 
    public int PostId { get; set; } 
    public string Title { get; set; } 
    public string Content { get; set; } 

    public Blog Blog { get; set; } 
} 

Bây giờ nếu tôi muốn cấu hình các mô hình mối liên hệ trong DbContext có bất kỳ sự khác biệt giữa:

modelBuilder.Entity<Post>() 
      .HasOne(p => p.Blog) 
      .WithMany(b => b.Posts); 

modelBuilder.Entity<Blog>() 
      .HasMany(b => b.Posts) 
      .WithOne(p => p.blog); 

và nếu có một diffrence, nó là gì? tôi nên viết cả hai hay chỉ một trong số họ?

Lưu ý: Tôi có phải xác định khóa ngoại không? Dựa trên kiến ​​thức của tôi về cơ sở dữ liệu, bạn không thể tạo mối quan hệ mà không có khóa ngoại nhưng EF không yêu cầu bạn phải có các trường khóa ngoài. Vậy làm thế nào để EF xử lý các mối quan hệ mà không biết các khóa ngoại? Nó có gây ra hiệu suất giảm hoặc lỗi không?

Trả lời

5

Bạn nói đúng, bạn có thể tạo mối quan hệ trong DbContext mà không có khóa ngoại trong cơ sở dữ liệu.

Ngoài ra:

WithOne: Một tới một mối quan hệ có một tài sản chuyển hướng tham khảo trên cả hai mặt. Họ tuân theo các quy ước tương tự như mối quan hệ một-nhiều, nhưng một chỉ số duy nhất được giới thiệu trên thuộc tính khóa ngoại để đảm bảo chỉ có một người phụ thuộc có liên quan đến mỗi hiệu trưởng.

Nhiều đối tượng: các mối quan hệ không có lớp tổ chức đại diện cho bảng tham gia chưa được hỗ trợ. Tuy nhiên, bạn có thể biểu diễn mối quan hệ nhiều-nhiều bằng cách bao gồm một lớp thực thể cho bảng kết nối và ánh xạ hai mối quan hệ một-nhiều riêng biệt.

Bạn chỉ cần xác định một mối quan hệ, bởi vì trong một số trường hợp, bạn sẽ tạo mối quan hệ cho cha mẹ-con không có thuộc tính điều hướng (một hoặc bộ sưu tập).

Ví dụ: bạn thêm một mối quan hệ cho Blog -> Bài viết bởi vì bạn có tính chất định hướng trong cả hai vật thể, hai dây chuyền làm giống nhau nhưng theo cách khác nhau:

  • Blog -> Các Bài đăng (mẹ - > trẻ em)
  • bài viết -> Blog (Child -> Chánh)
+1

vì vậy bạn có nói rằng không có sự khác biệt giữa 2 phương pháp và một trong hai cách tôi có thể sử dụng các mô hình theo cùng một cách?nhưng sử dụng HasOne(). WithMany là tốt hơn? – soorena12

+0

Trong trường hợp này không có cách nào tốt hơn, chúng chỉ là cách khác nhau để tạo mối quan hệ giữa hai đối tượng, thường là ánh xạ từ con đến phụ huynh –

+1

"Bạn có thể tạo mối quan hệ trong DbContext mà không có khóa ngoại trong cơ sở dữ liệu." Điều này LAF không đúng. EF sẽ giới thiệu một thuộc tính shadow không có trong model của bạn, nhưng sẽ nằm trong cơ sở dữ liệu. – Knelis

2

bạn có thể xác định mô hình của bạn mà không có một tài sản quan trọng của nước ngoài. Tuy nhiên, Entity Framework sẽ giới thiệu một thuộc tính shadow, nó sẽ nằm trong cơ sở dữ liệu.

Theo documentation:

Trong khi nó được khuyến khích để có một tài sản quan trọng nước ngoài quy định tại các lớp thực thể phụ thuộc, nó không phải là cần thiết. Nếu không tìm thấy thuộc tính khóa ngoài nào, một thuộc tính khóa ngoài của bóng sẽ được giới thiệu với tên <navigation property name><principal key property name> (xem Shadow Properties để biết thêm thông tin).

+0

Nó sẽ không được "trong cơ sở dữ liệu", mà là trong định nghĩa thực thể trong EF Core. – Doug

+0

Nó chắc chắn sẽ có trong cơ sở dữ liệu. Một lần nữa, theo tài liệu: 'Thuộc tính Shadow rất hữu ích khi có dữ liệu trong cơ sở dữ liệu không được hiển thị trên các loại thực thể được ánh xạ. Chúng thường được sử dụng cho các thuộc tính khóa ngoài, trong đó mối quan hệ giữa hai thực thể được biểu diễn bằng giá trị khóa ngoài trong cơ sở dữ liệu, nhưng mối quan hệ được quản lý trên các loại thực thể sử dụng thuộc tính điều hướng giữa các loại thực thể.' – Knelis

+0

Thuộc tính bóng là một Entity Framework khái niệm, không phải là một khái niệm cơ sở dữ liệu. Vì vậy, không, họ không phải là "trong cơ sở dữ liệu." Tôi đề cập đến điều này chỉ cho rõ ràng cho bất cứ ai nghiên cứu chủ đề này. – Doug

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