2016-05-17 54 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

感谢您的确认。 –