是否有可能将两个表格关系平铺到实体框架中的单个实体中?拼合复合实体
具体地,给出用于定义一个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连接来组合实体,并返回视图可以轻松返回的内容。 –
换句话说,你必须治愈后退。事实上,它的理由完全是*为什么你不应该映射到表。你强制*另外两个*维护(映射,查询),*离开*原始模式(表),*不能*同时部署,强制代码和数据库之间的耦合。你最终将表格设计泄漏到应用程序的设计中。优化性能会很困难,因为哪些查询会引起问题并不明显。 –