2011-11-30 35 views
8

Khi tạo các lớp POCO chứa các bộ sưu tập kiểu nguyên thủy và được tiếp tục bằng EF Code Đầu tiên, lời khuyên tốt nhất mà tôi đã tìm được cho đến nay là tạo một lớp mới có ID cộng với loại nguyên thủy:Mã khung thực thể đầu tiên và các bộ sưu tập của các loại nguyên thủy

Entity Framework and Models with Simple Arrays

Nếu bây giờ tôi có một vài lớp học đòi hỏi tính chất của loại ObservableCollection<string> và thay thế chúng với ObservableCollection<EntityString> (nơi EntityString là một kiểu tùy chỉnh với một Id và một tài sản string), tôi kết thúc với một bảng EntityString có nhiều cột khóa ngoài, một cho mỗi thuộc tính loại ObservableCollection<EntityString> trên tất cả các loại cụ thể với các thuộc tính như vậy.

Điều này dẫn đến các cột khóa ngoài chủ yếu là rỗng trong bảng EntityString.

Một cách tiếp cận sẽ là tạo một lớp con của EntityString và sử dụng mô hình Table per Type cho các lớp con đó. Tuy nhiên, điều đó đòi hỏi phải thực hiện các thay đổi khó xử đối với mô hình đối tượng đơn giản để thích ứng với Entity Framework.

Câu hỏi:

  • Sản phẩm Encapsulating gõ cách tốt nhất để quản lý Collection<PrimitiveType>?
  • Nếu vậy, các chuyên gia và con của việc cho phép nhiều (nhiều) cột khóa ngoài so với việc tạo bảng tùy chỉnh cho mỗi loại (với chi phí của một mô hình khó xử) là gì?

Trả lời

5

Quảng cáo loại đơn giản cho thực thể là một tùy chọn. Nếu bạn muốn sử dụng thực thể kiểu nguyên thủy mới đó trong nhiều quan hệ tốt hơn là loại bỏ hoàn toàn các thuộc tính điều hướng khỏi thực thể đó và sử dụng liên kết độc lập (không có các thuộc tính FK).

public class StringEntity 
{ 
    public int Id { get; set; } 
    public string Text { get; set; } 
} 

và lập bản đồ:

modelBuilder.Entity<Foo1>().HasMany(f => f.Strings).WithOptional(); 
modelBuilder.Entity<Foo2>().HasMany(f => f.Strings).WithOptional(); 

Trong cơ sở dữ liệu, bạn sẽ nhận FK nullable mới mỗi chủ yếu liên quan - không có cách nào để tránh nó trừ tạo đặc biệt StringEntity lớp mỗi gốc (không sử dụng thừa kế cho bởi vì nó ảnh hưởng đến hiệu suất).

Có một sự thay thế:

public class StringEntity 
{ 
    public int Id { get; set; } 
    public List<string> Strings { get; private set; } 

    public string Text 
    { 
     get 
     { 
      return String.Join(";", Strings); 
     } 

     set 
     { 
      Strings = value.Split(";").ToList(); 
     } 
    } 
} 

Trong trường hợp này bạn không cần phải loại thực thể liên quan (và bảng bổ sung) nhưng thực thể của bạn đang bị ô nhiễm với additional property Text mà chỉ dành cho sự kiên trì.

+1

Giải pháp này giả định rằng ';' (hoặc bất kỳ ký tự ma thuật nào khác được chọn) không phải là đầu vào hợp lệ cho chuỗi cơ sở, đúng không? –

+0

Có thể thể hiện cấu hình thông thạo 'WithOptional' bằng thuộc tính lớp thay thế không? Tôi hiểu rằng họ là lựa chọn thay thế cho nhau, nhưng đã không tìm thấy tài liệu hoàn chỉnh về chủ đề này cho đến nay. –

+0

Nếu ánh xạ mặc định không tạo mối quan hệ tùy chọn, bạn không thể thay đổi nó bằng chú thích dữ liệu. Chú thích dữ liệu phải được đặt trên một số thuộc tính nhưng trong trường hợp này không có thuộc tính nào trong thực thể phụ thuộc để sử dụng. –

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