2015-10-19 68 views
1

使用實體框架6,我想知道如果我需要一個映射文件。我有這樣定義的模型:我需要映射文件嗎?

[Table("UploadedFile")] 
public partial class UploadedFile 
{ 
    [Key, ForeignKey("Resource"), DatabaseGenerated(DatabaseGeneratedOption.None)] 
    public System.Guid FileId { get; set; } 
    public virtual Resource Resource { get; set; } 

    //... 
    public System.DateTime Modified { get; set; } 

    public bool IsActive { get; set; } 
    public byte[] RecordVersion { get; set; } 

    public UploadedFile() 
    { 
     Resource = new Resource(); 
    } 
} 

我的映射文件是這樣的:

public class UploadedFileMapping : EntityTypeConfiguration<UploadedFile> 
{ 
    public UploadedFileMapping() 
    { 
     //Primary key 
     HasKey(t => t.FileId); 
     //Constraints 
     Property(t => t.RecordVersion).IsRowVersion(); 
    } 
} 

我可以只依靠模型中的屬性?使用映射文件有什麼優點/缺點?

我相信模型中的[Key]屬性否定了HasKey的需要,這是正確的嗎?

回答

0

您可以使用基於屬性的映射。您的情況下不需要映射文件。但我建議學習Fluent Api並使用它。

一般來說,你有多種選擇:

不要使用任何明確的映射 - 僅僅依靠公約(內置或自定義)。它可以用在簡單的情況下。爲此,您的DbContext應該通過DbSet或通過已知類型的引用來了解您的實體。

  • 優點:
    • 無需額外的代碼。
  • 缺點:
    • 你必須知道的所有公約和該解決方案是不靈活。

使用數據註解。基於屬性的映射非常直觀和簡單。

  • 優點:
  • 很簡單。
  • 它不僅可以被實體框架使用,也可以用於驗證(例如在ASP.NET MVC或WPF中)。
  • 某些屬性只能通過數據註釋(例如MinValue和DefaultValue)來定義。
  • 缺點:
    • 它不像Fluent API那麼靈活。
    • 由於大量的屬性,讀取模型代碼可能有點困難。
    • 您的模型與實體框架緊密結合。

用流利的API(有映射文件)。這是具有更多可能性的最先進的方案(請參閱here以獲得更詳細的參考資料)。

  • 優點:
    • 它靈活。您可以有更多的映射可能性。
    • 您可以擁有乾淨的域模型,而不需要實體框架依賴。
  • 缺點:
    • 它可以是一個有點困難。

,你也可以結合以前的3種方法。您可以一起使用所有這些解決方案。 例如:

  1. 您滿意的默認的命名慣例,這樣你就不必爲您的表定義名稱。
  2. 您可以使用數據註釋重新使用它們進行驗證。
  3. 您可以使用Fluent Api定義不支持的數據註釋部分。

    • 缺點:
    • 這是一個有點複雜,找出整個配置,因爲它在多個地方定義。所以請謹慎使用此方法。
0

EF Fluent Api比數據註釋更好,因爲它允許域模型層隔離並且更靈活(例如,IsRowVersion只能在流暢的Api中添加)。 關鍵屬性是多餘的。

+0

但是,它更多的是一種痛苦。我不會完全同意域模型隔離......它取決於您在應用程序中使用DTO/ViewModels/Models的方式。此外,您應該只真正從數據庫中投射出您真正想要的東西,因此應該永遠不會有整個數據庫以代碼模型化的時間。 (這僅用於創建表和遷移) –