2016-05-17 78 views
1

是否有可能將兩個表格關係平鋪到實體框架中的單個實體中?拼合複合實體

具體地,給出用於定義一個1-1關係

create table Foo 
(
    Id int not null identity (1, 1) 
     constraint PK_Foo_Id primary key (Id), 
    Name nvarchar(64) not null, 
    BarId int not null 
     constraint FK_Bar_Foo foreign key (BarId) references Bar (Id) 
) 

create table Bar 
(
    Id int not null identity (1, 1) 
     constraint PK_Bar_Id primary key (Id), 
    Value nvarchar(max) not null 
) 

我可以很容易地這樣

public class Foo 
{ 
    public int Id { get; set;} 
    public string Name { get; set;} 
    public Bar Bar { get; set;} 
} 

public class Bar 
{ 
    public int Id { get; set;} 
    public string Value { get; set;} 
} 

此映射到實體下面的兩個表(簡化例如)但是,我會喜歡映射到單個扁平實體

public class FlatFoo 
{ 
    public int Id { get; set;} 
    public string Name { get; set;} 
    public string Value { get; set;} 
} 

請注意,只有一個字段米表酒吧映射到FlatFoo

  • 的實際表都較大。
  • 由於Bar中的文本值可能變大,因此它會快速填充索引頁,因此有兩個表可以更快地對Foo.Id和Foo.Name進行索引搜索。
  • 我已經看過拆分實體,但它需要兩個表具有相同的主鍵。
  • 我已經看過複雜類型,但它的工作方式與此相反,需要一張平坦的表格並分解成複合實體。
  • 我正在尋找使用Fluent API來執行映射。

您是否可以提供任何幫助來展平兩個表和單個實體之間的映射?

更新

是,意見將努力得到一個平坦的實體,但後來我不是從表映射到實體。同樣,從另一方面來說,我知道可以映射到非公開的構圖並以這種方式公開財產。但是,如果EF流暢API足夠靈活,可以直接處理映射,而不是解決特定問題,那麼我對學習更感興趣。

不幸的是,在這裏(工作中)存在相當多的推回,即向表中添加除表以外的任何其他內容(包括視圖在內的基本知識)。通常指出,這樣做會增加額外的維護點,增加對支持的培訓,增加基本CRUD的複雜性以及不學習可用工具的其他藉口。這是愚蠢的,但它是我必須處理的。 :(

所以,學習對我的一點,就是它可以使用EF做直接映射領域的這個看似基本任務從任意兩個表成一個實體,流暢的API首選?

+2

爲什麼不創建一個SQL VIew並使用EF將結果映射到FlatFoo? – CodeNotFound

+0

沒有說你hav e將實體映射到*表*。事實上,使用*映射*代替正確的數據庫設計是一種非常強烈的氣味和[Golden Hammer](http://deviq.com/golden-hammer/)反模式的強烈信號。通常情況下,另一個反模式嘗試使用LINQ連接來組合實體,並返回視圖可以輕鬆返回的內容。 –

+1

換句話說,你必須治癒後退。事實上,它的理由完全是*爲什麼你不應該映射到表。你強制*另外兩個*維護(映射,查詢),*離開*原始模式(表),*不能*同時部署,強制代碼和數據庫之間的耦合。你最終將表格設計泄漏到應用程序的設計中。優化性能會很困難,因爲哪些查詢會引起問題並不明顯。 –

回答

3

實體框架沒有按沒有提供將一個實體映射到兩個表的方法,然後按照您描述的方式從列中選擇櫻桃,除非這些表共享一個公共密鑰。所以正如評論中提到的,最簡單的解決方案是創建一個View並映射

public class FlatFooMap : EntityTypeConfiguration<FlatFoo> 
{ 
    public FlatFooMap() 
    { 
     ToTable("vwFlatFoo"); 
     HasKey(t => t.Id);       
    } 
} 
+0

更新了問題 - 謝謝 –

+0

更新了答案,但您可能不會喜歡它。或者,它可能會爲您提供所需的彈藥,以將頭撞到一起。 –

+0

感謝您的確認。 –