展平复合实体



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

具体来说,(例如简化)给定以下两个表,定义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首选?

Entity Framework没有提供一种方法来将一个实体映射到两个表,然后按照您描述的方式从列中挑选,除非这些表共享一个公共键。因此,正如评论中提到的,最简单的解决方案是创建一个视图并将实体映射到该视图。

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

相关内容

  • 没有找到相关文章

最新更新