具有TPH继承的实体类型到多个表的EF映射属性

用户名

我想使用实体类型到数据库中多个表的映射属性(实体拆分),而同时使用“映射逐层表(TPH)继承”,因此,我的模型映射代码如下:

   modelBuilder
    .Entity<Person>()
    .HasKey(n => n.PersonId)
    .Map(map =>
    {
        map.Properties(p => new { p.Name });
        map.ToTable("dbo.Person");
    })
    .Map<Customer>(map =>
    {
        map.Requires("PersonType").HasValue("C");
        map.Properties(p => new { p.CustomerNumber });
        map.ToTable("dbo.Customer");
    });

基于以下基础数据库架构:

create table dbo.Person
(
    PersonId int not null identity(1,1) primary key,
    PersonType char(1) not null,
    Name varchar(50) not null
)

create table dbo.Customer
(
    PersonId int not null references dbo.Person (PersonId),
    CustomerNumber varchar(10) not null
)

但是,当EF尝试执行我的查询时:

ctx.People.ToList();

引发以下异常消息:

Invalid column name 'PersonType'.

运行一个SQL配置文件,它似乎试图PersonType使用值的谓词,而不是在我的鉴别器实际所在使用值Cdbo.Customerdbo.Person

如果我使用一个或另一个功能,即仅继承或仅使用其他表映射,则它可以工作,但是我放弃了一些要求。

EF Fluent API可以完成我的工作吗?

谢谢你的时间。

用户名

这可以通过在映射中涉及的所有表模式上创建视图来实现:

create view dbo.vw_PersonExtended
as

    select
        p.Name, p.PersonId, p.PersonType, c.CustomerNumber
    from
        dbo.Person p
        left join dbo.Customer c on c.PersonId=p.PersonId

并将此视图映射到基类类型,Person并删除派生类表映射,如下所示:

   modelBuilder
    .Entity<Person>()
    .HasKey(n => n.PersonId)
    .Map(map =>
    {
        map.Properties(p => new { p.Name });
        map.ToTable("dbo.vw_PersonExtended");
    })
    .Map<Customer>(map =>
    {
        map.Requires("PersonType").HasValue("C");
        map.Properties(p => new { p.CustomerNumber });
    });

由于视图具有多个基表,因此在插入新实体时将失败,因此您必须使用INSTEAD OF TRIGGER或使用Fluent代码将插入映射到存储过程,如下所示:

    modelBuilder
        .Entity<Customer>()
        .MapToStoredProcedures(map => map.Insert(i => i.HasName("usp_InsertCustomer")));

并插入存储过程示例为:

create procedure dbo.usp_InsertCustomer
    @Name varchar(50),
    @CustomerNumber varchar(50)
as
begin

        set nocount on
        declare @id int

        insert into dbo.Person (Name, PersonType)
        values (@Name, 'C')
        set @id = scope_identity()

        insert into dbo.Customer (PersonId, CustomerNumber)
        values (@id, @CustomerNumber)

        select @id as PersonId

end

显然,这种方法的缺点是使这种工作涉及到所有的管道工作。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何动态地将单个实体类映射到多个表?

来自分类Dev

实体框架6和TPH继承:默认情况下,将具有相同名称的属性映射到同一列

来自分类Dev

实体框架与相同实体类型但具有不同关系类型的多对多关系

来自分类Dev

实体框架代码第一个到多个可选,具有流畅的映射

来自分类Dev

API应用程序中从实体类型到DTO的映射

来自分类Dev

实体类型没有定义键EF6

来自分类Dev

具有TPH继承的实体类型到多个表的EF映射属性

来自分类Dev

EF代码优先:具有多个多对一关系的实体类型

来自分类Dev

具有导航属性的实体框架继承

来自分类Dev

具有相同标签的L1实体类型和L3实体类型

来自分类Dev

Ef Core 3实体类型XOrder不能映射到表,因为它是从Order派生的。只能将基本实体类型映射到表

来自分类Dev

实体类型“客户”不能映射到表,因为它是从“ ApplicationUser”派生的

来自分类Dev

找不到实体类型的属性的后备字段,并且该属性没有吸气剂

来自分类Dev

EF Core:无法跟踪实体类型的实例,因为另一个具有相同键值的实例

来自分类Dev

具有Automapper的EF Core引发异常“无法跟踪实体类型”

来自分类Dev

是否可以使用JPA映射具有多个表的单个实体?

来自分类Dev

创建从属性名称到具有该属性的类型的映射

来自分类Dev

API应用程序中从实体类型到DTO的映射

来自分类Dev

Symfony 2.7表单实体类型在表单中呈现多个属性

来自分类Dev

EF代码优先:具有多个多对一关系的实体类型

来自分类Dev

Netbeans向导数据库中的实体类,未映射所有表

来自分类Dev

如何使用自动映射器映射具有多个自定义属性类型的类

来自分类Dev

所有实体类型的键属性必须映射到存储函数返回的相同非空列

来自分类Dev

创建具有多个表作为属性类型的属性

来自分类Dev

如何将多个类(同一实体但具有增强属性)映射到同一数据库表?

来自分类Dev

实体框架核心 DbContextOptionsBuilder.UseModel 创建没有属性的实体类型

来自分类Dev

Hibernate - 具有作为接口的属性的实体类

来自分类Dev

从具有多个实体的映射器中获取实体

来自分类Dev

JPA 本机查询结果集映射到具有子类的实体类

Related 相关文章

  1. 1

    如何动态地将单个实体类映射到多个表?

  2. 2

    实体框架6和TPH继承:默认情况下,将具有相同名称的属性映射到同一列

  3. 3

    实体框架与相同实体类型但具有不同关系类型的多对多关系

  4. 4

    实体框架代码第一个到多个可选,具有流畅的映射

  5. 5

    API应用程序中从实体类型到DTO的映射

  6. 6

    实体类型没有定义键EF6

  7. 7

    具有TPH继承的实体类型到多个表的EF映射属性

  8. 8

    EF代码优先:具有多个多对一关系的实体类型

  9. 9

    具有导航属性的实体框架继承

  10. 10

    具有相同标签的L1实体类型和L3实体类型

  11. 11

    Ef Core 3实体类型XOrder不能映射到表,因为它是从Order派生的。只能将基本实体类型映射到表

  12. 12

    实体类型“客户”不能映射到表,因为它是从“ ApplicationUser”派生的

  13. 13

    找不到实体类型的属性的后备字段,并且该属性没有吸气剂

  14. 14

    EF Core:无法跟踪实体类型的实例,因为另一个具有相同键值的实例

  15. 15

    具有Automapper的EF Core引发异常“无法跟踪实体类型”

  16. 16

    是否可以使用JPA映射具有多个表的单个实体?

  17. 17

    创建从属性名称到具有该属性的类型的映射

  18. 18

    API应用程序中从实体类型到DTO的映射

  19. 19

    Symfony 2.7表单实体类型在表单中呈现多个属性

  20. 20

    EF代码优先:具有多个多对一关系的实体类型

  21. 21

    Netbeans向导数据库中的实体类,未映射所有表

  22. 22

    如何使用自动映射器映射具有多个自定义属性类型的类

  23. 23

    所有实体类型的键属性必须映射到存储函数返回的相同非空列

  24. 24

    创建具有多个表作为属性类型的属性

  25. 25

    如何将多个类(同一实体但具有增强属性)映射到同一数据库表?

  26. 26

    实体框架核心 DbContextOptionsBuilder.UseModel 创建没有属性的实体类型

  27. 27

    Hibernate - 具有作为接口的属性的实体类

  28. 28

    从具有多个实体的映射器中获取实体

  29. 29

    JPA 本机查询结果集映射到具有子类的实体类

热门标签

归档