Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 展平复合实体_C#_Sql Server_Entity Framework_Ef Fluent Api - Fatal编程技术网

C# 展平复合实体

C# 展平复合实体,c#,sql-server,entity-framework,ef-fluent-api,C#,Sql Server,Entity Framework,Ef Fluent Api,在实体框架中,是否可以将两个表的关系扁平化为单个实体 具体来说,(例如简化)给出了定义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

在实体框架中,是否可以将两个表的关系扁平化为单个实体

具体来说,(例如简化)给出了定义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 fluent API是否足够灵活,可以直接处理映射,而不是解决特定问题

不幸的是,对于向数据库中添加表以外的任何内容(包括视图等基本内容)的建议,这里(在工作中)有相当大的阻力。通常会指出,这样做会增加额外的维护点,增加支持培训,增加基本CRUD的复杂性,以及其他不学习可用工具的借口。这充其量是愚蠢的,但这是我必须处理的事情(


因此,作为我的一个学习点,是否可以使用EF(首选fluent API)将字段从两个任意表直接映射到一个实体,这似乎是一项基本任务?

实体框架没有提供一种方法将一个实体映射到两个表,然后按照您描述的方式从列中选择字段,除非表共享一个公共键。如注释中所述,最简单的解决方案是创建一个视图并将实体映射到该视图

public class FlatFooMap : EntityTypeConfiguration<FlatFoo>
{
    public FlatFooMap ()
    {
        ToTable("vwFlatFoo");
        HasKey(t => t.Id);                        
    }
}
公共类FlatFooMap:EntityTypeConfiguration
{
公共平面图()
{
ToTable(“VFlatfoo”);
HasKey(t=>t.Id);
}
}

为什么不创建一个SQL视图并使用EF将结果映射到FlatFoo?没有人说必须将实体映射到表。事实上,使用映射作为正确数据库设计的替代品是一种非常强烈的气味,也是反模式的强烈标志。通常另一种反模式紧随其后,试图使用LINQ连接来组合实体并返回t视图可以同样容易地返回。换句话说,您必须解决回推问题。事实上,它的理由正是您不应该映射到表的原因。您强制另外两个维护点(映射、查询)离开原始模式(表)这不能同时部署,迫使代码和数据库之间的耦合更强。最终会将表设计泄漏到应用程序的设计中。优化性能将很困难,因为不清楚是哪个查询导致了问题。更新了答案,但您可能不喜欢它。或者它可能会为您提供您需要的弹药需要把所有人都召集起来。谢谢你的确认。