2012-02-12 25 views
7

Khi nhìn vào câu hỏi và câu trả lời trên trang web này và đọc một số các hướng dẫn của Google xếp hạng hàng đầu trên xây dựng Quy tắc đầu tiên tôi thường xuyên xem các mô hình sau ...Điểm tạo thuộc tính khóa ngoài khi sử dụng Mã khung thực thể đầu tiên là gì?

public class Category 
{ 
    public Category() 
    { 
     Products = new Collection<Product>(); 
    } 
    public Guid ID { get; set; } 
    public string Name { get; set; } 
    public virtual ICollection<Product> Products { get; set; } 
} 

public class Product 
{ 
    public Guid ID { get; set; } 
    public string Name { get; set; } 
    public DateTime DateAdded { get; set; } 
    public Guid CategoryID { get; set; } // Seemingly redundant property 
    public virtual Category Category { get; set; } 
} 

Khi tìm kiếm Mã đầu tiên hướng dẫn sau hai trang đưa ra sử dụng mà cùng một khuôn mẫu này:

http://weblogs.asp.net/scottgu/archive/2010/07/16/code-first-development-with-entity-framework-4.aspx

http://www.codeproject.com/Articles/327945/Architecture-Guide-ASP-NET-MVC3-Entity-Framework-C

Câu hỏi: Vậy điểm của thuộc tính khóa ngoài trên đối tượng Code First C# là gì? Trong ví dụ trên, bạn có thể bỏ qua CategoryID từ lớp Product và mọi thứ sẽ hoạt động tốt. Khoá ngoài Category_ID sẽ vẫn được tạo trong cơ sở dữ liệu. Điều duy nhất tôi có thể nghĩ là mọi người có thể muốn xác định liệu mối quan hệ là tùy chọn sử dụng các loại nullable thay vì API thông thạo, nhưng tôi nghĩ rằng nó thực sự gây nhầm lẫn để có cả thuộc tính CategoryCategoryID .

Vì vậy, trước khi tôi đi xung quanh và loại bỏ tất cả các thuộc tính khóa ngoại của tôi, có bất kỳ điều gì tôi thiếu ở đây không? Điểm của việc này là gì?

Cảm ơn!

+0

Tôi nghĩ rằng làm cho nó một 'Guid' làm? một dfference. Một số DataAnnotations có thể áp dụng. –

+0

Có, tôi đã đề cập rằng trong câu hỏi của tôi ... bất cứ điều gì không thể được thực hiện bằng cách sử dụng API thông thạo mặc dù? Có vẻ khá xấu để có hai thuộc tính bản sao cơ bản khi bạn không phải. –

+0

Có thể trùng lặp của [Mã số đầu tiên: Các hiệp hội độc lập so với các hiệp hội khóa nước ngoài?] (Https://stackoverflow.com/questions/5281974/code-first-independent-associations-vs-foreign-key-associations) –

Trả lời

8

Vâng, tôi nghĩ rằng không cần thiết cho các thuộc tính quan trọng của nước ngoài và chúng bằng cách nào đó là một tạo tác quan hệ trong thế giới đối tượng. Bạn có thể xác định hoàn toàn mối quan hệ mà không có thuộc tính FK. Trong API thông thạo, bạn có thể xác định xem mối quan hệ là tùy chọn hay bắt buộc và bạn có thể chỉ định tên cột khóa ngoài của bảng cơ sở dữ liệu. Mối quan hệ sau đó được gọi là Hiệp hội độc lập.

Sự hiểu biết của tôi là Hiệp hội khóa nước ngoài - mối quan hệ với các thuộc tính khóa ngoại trong lớp mô hình của bạn - chỉ tồn tại để làm việc với các mối quan hệ trong khung thực thể dễ dàng hơn và thoải mái hơn trong một số trường hợp nhất định. Ví dụ:

Giả sử bạn có chế độ xem web để tạo hoặc chỉnh sửa sản phẩm và chế độ xem chứa hộp tổ hợp để chọn một danh mục và gán nó cho sản phẩm. Để điền vào hộp kết hợp khi khung nhìn được hiển thị, bạn sẽ tải, ví dụ: IDName của tất cả các danh mục từ cơ sở dữ liệu.

Khi trang được đăng lại, bạn sẽ nhận được các thuộc tính cho sản phẩm và ID của danh mục đã chọn. Nếu bạn không có một ngoại sở hữu CategoryID quan trọng trong việc bạn Product bạn sẽ phải tạo ra các mối quan hệ theo cách này:

var category = new Category { ID = IDFromComboBox }; 
context.Categories.Attach(category); 
product.Category = category; 

Với một tài sản FK bạn chỉ cần một dòng:

product.CategoryID = IDFromComboBox; 

chìa khóa ngoại các thuộc tính không tồn tại trong Entity Framework phiên bản 1 (.NET 3.5) và đã được giới thiệu với phiên bản EF 4 (.NET 4) để hỗ trợ các kịch bản như trên.

Một quan điểm quan trọng trên Hiệp hội chính nước ngoài có thể được tìm thấy và sự khác biệt giữa hai loại của các hiệp hội là rất nổi thảo luận trong Ladislav blog:

http://www.ladislavmrnka.com/2011/05/foreign-key-vs-independent-associations-in-ef-4/

+0

Cảm ơn phản hồi sâu và tham chiếu blog. Có lẽ tôi đang thiếu một cái gì đó từ ví dụ của bạn mặc dù ... Nếu bạn cư một combobox với các loại từ cơ sở dữ liệu và các hình thức được đăng trở lại với ID thể loại được lựa chọn sẽ không bạn cố gắng kéo danh mục từ cơ sở dữ liệu ('var category = db.Single (x => x.ID == id); '), thực hiện xác nhận, và sau đó gán danh mục bằng cách đơn giản là đi' product.Category = category'? –

+0

@JohntheRevelator: Vâng, đó là giải pháp thay thế. Nhưng nó sẽ yêu cầu một vòng lặp cơ sở dữ liệu bổ sung. Bạn không cần gói này nếu bạn có ID, đó là những gì 'Đính kèm' là cho. Xác nhận là một điểm tốt mặc dù, bạn có nghĩa là xác nhận nếu danh mục với ID đã đăng tồn tại ở tất cả, phải không? Bạn vẫn có thể làm điều đó với 'if (db.Categories.Any (x => x.ID == id)) ...' mà chỉ trả về một 'bool' và sẽ rẻ hơn trả về toàn bộ danh mục. – Slauma

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