2014-02-17 167 views
2

我正在使用Entity Framework 6.0.2將一些簡單的手工編碼模型映射到現有的數據庫結構。目前的主要模式是:告訴EF 6忽略私有屬性

public class Occurrence 
{ 
    public int ID { get; set; } 
    public Guid LegacyID { get; set; } 
    public string Note { get; set; } 
    public virtual ICollection<OccurrenceHistory> History { get; set; } 
} 

(該OccurrenceHistory模型是不是這真的相關,但部分工作正常,其中EF負載可達孩子記錄這一模式。)

的映射是簡單的,我儘可能地做到明確的,因爲我可以(因爲隨着應用的增長會有一些直觀的少映射):

public class OccurrenceMap : EntityTypeConfiguration<Occurrence> 
{ 
    public OccurrenceMap() 
    { 
     ToTable("Occurrence"); 
     HasKey(o => o.ID); 
     Property(o => o.ID).IsRequired().HasColumnName("ID"); 
     Property(o => o.LegacyID).IsRequired().HasColumnName("LegacyID"); 
     Property(o => o.Note).IsUnicode().IsOptional().HasColumnName("Note"); 
    } 
} 

但是,如果我添加了一個私有財產模型,EF試圖將其映射到數據庫。事情是這樣的:

private OccurrenceHistory CurrentHistory { get; set; } 

(內部模型我會保持這一領域,對於其他私人運營的一些邏輯。)當EF生成SELECT聲明它結束了尋找一列名爲CurrentHistory_ID這當然不存在。

我可以讓財產公開,並設置映射忽略它:

Ignore(o => o.CurrentHistory); 

但我不希望屬性是公共的。該模型將內部跟蹤應用程序代碼不應該看到的一些信息。

有沒有辦法告訴EF忽略任何和所有的私人成員?即使它是按照每個地圖的基礎?我特別喜歡這樣做,而不必將EF數據註釋添加到模型本身,因爲這不僅僅是一個漏洞抽象(持久性 - 無知模型會在其上具有持久性信息),但它也意味着包含模型的域核心組件在任何地方都會引用EntityFramework.dll,這並不理想。

+1

您可以在屬性上使用'[NotMapped]'屬性。 – EkoostikMartin

+0

@EkoostikMartin:我有點希望不必在具有模型的程序集中添加對'DataAnnotations'的依賴。這感覺就像是一個抽象的漏洞,因爲模型需要持久性信息。 – David

+0

如果你不想使用數據註解,你應該能夠以與你可以配置私有屬性相同的方式忽略私有屬性 - http://romiller.com/2012/10/01/mapping-to-private- Property-with-code-first/ – Pawel

回答

3

一位同事指我a blog post,這導致了一個非常實用的方法。

所以我有什麼是私人財產:

private OccurrenceHistory CurrentHistory { get; set; } 

問題的核心是,我不能使用我的映射:

Ignore(o => o.CurrentHistory); 

因爲,很顯然,財產是私有的,在這種情況下無法訪問。什麼是博客文章建議是暴露公共靜態表達它引用的私有財產:

private OccurrenceHistory CurrentHistory { get; set; } 
public static readonly Expression<Func<Occurrence, OccurrenceHistory>> CurrentHistoryExpression = o => o.CurrentHistory; 

然後我就可以參考,在映射

Ignore(Occurrence.CurrentHistoryExpression); 

正如任何事情,它是一個組合優點和缺點。但在這種情況下,我認爲職業球員遠遠超過了缺點。

優點:

  • 域芯組件不需要攜帶一個參考EntityFramework.dll
  • 持久性映射完全封裝在DAL程序集中。

缺點:

  • 模型需要公開他們的內部運作的少量信息。

con破封裝,但只有一點點。使用代碼仍然無法訪問該屬性或其實例的值,它只能看到屬性靜態地存在。這真的不是什麼大問題,因爲開發人員無論如何都可以看到它。我覺得封裝的精神在任何給定的模型實例中都保留下來。