是否有可能將兩個表格關係平鋪到實體框架中的單個實體中?拼合複合實體
具體地,給出用於定義一個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首選?
爲什麼不創建一個SQL VIew並使用EF將結果映射到FlatFoo? – CodeNotFound
沒有說你hav e將實體映射到*表*。事實上,使用*映射*代替正確的數據庫設計是一種非常強烈的氣味和[Golden Hammer](http://deviq.com/golden-hammer/)反模式的強烈信號。通常情況下,另一個反模式嘗試使用LINQ連接來組合實體,並返回視圖可以輕鬆返回的內容。 –
換句話說,你必須治癒後退。事實上,它的理由完全是*爲什麼你不應該映射到表。你強制*另外兩個*維護(映射,查詢),*離開*原始模式(表),*不能*同時部署,強制代碼和數據庫之間的耦合。你最終將表格設計泄漏到應用程序的設計中。優化性能會很困難,因爲哪些查詢會引起問題並不明顯。 –