将表的每个层次结构继承用于1:2关系

沙巴玛凯

我的以下Jobcard课程有两个小节MechanicalJobcardPanelbeatingJobcard

public abstract class Jobcard : Entity, IAggregateRoot
{
    public int VehicleId { get; private set; }
    public int JobcardTypeId { get; protected set; }
    public string Opened_By { get; private set; } //TODO Identity Sever
    public DateTime Open_Date { get; private set; }
    public Vehicle Vehicle { get; private set; }
    public JobcardType JobcardType { get; private set; }

    public Jobcard()
    {
        Opened_By = "Job card opener";
        Open_Date = DateTime.Now;
    }
}
public class PanelBeatingJobcard : Jobcard
{
    public PanelBeatingJobcard()
    {
        JobcardTypeId = 1;
    }
}

public class MechanicalJobcard: Jobcard
{
    public MechanicalJobcard()
    {
        JobcardTypeId = 2;
    }
}

我有一个车辆的既有MechanicalJobcardPanelbeatingJobcard

public class Vehicle: Entity, IAggregateRoot
{
    public int Id{ get; set; }
   //Other properties here...

    public PanelBeatingJobcard PanelBeatingJobcard { get; set; }
    public MechanicalJobcard MechanicalJobcard { get; set; }
}

我似乎可以使用流畅的API将它们映射到数据库。

我试过了

class PanelBeatingJobCardEntityTypeConfiguration: IEntityTypeConfiguration<PanelBeatingJobcard>
{
    public void Configure(EntityTypeBuilder<PanelBeatingJobcard> panelBeatinglJobcardConfig)
    {
        panelBeatinglJobcardConfig.HasOne(j => j.Vehicle).WithOne(v => v.PanelBeatingJobcard).HasForeignKey<Jobcard>(j => j.VehicleId);
    }
}
class MechanicalJobcardEntityTypeConfiguration: IEntityTypeConfiguration<MechanicalJobcard>
{
    public void Configure(EntityTypeBuilder<MechanicalJobcard> mechanicalJobcardConfig)
    {
        mechanicalJobcardConfig.HasOne(j => j.Vehicle).WithOne(v => v.MechanicalJobcard).HasForeignKey<Jobcard>(j => j.VehicleId);
    }
}

但是我在以下错误Add-Migration

You are configuring a relationship between 'PanelBeatingJobcard' and 'Vehicle' but have specified a foreign key on 'Jobcard'. The foreign key must be defined on a type that is part of the relationship

如果我同时删除这两种配置,则会收到以下错误消息Add-Migration

Both relationships between 'Jobcard.Vehicle' and 'Vehicle' and between 'MechanicalJobcard' and 'Vehicle.MechanicalJobcard' could use {'VehicleId'} as the foreign key. To resolve this configure the foreign key properties explicitly on at least one of the relationships.

编辑:

如果将注释中建议的“实体类型配置”更改为以下内容:

class PanelBeatingJobCardEntityTypeConfiguration: IEntityTypeConfiguration<PanelBeatingJobcard>
{
    public void Configure(EntityTypeBuilder<PanelBeatingJobcard> panelBeatinglJobcardConfig)
    {
        panelBeatinglJobcardConfig.HasOne(j => j.Vehicle).WithOne(v => v.PanelBeatingJobcard).HasForeignKey<PanelBeatingJobcard>(j => j.VehicleId);
    }
}
class MechanicalJobcardEntityTypeConfiguration: IEntityTypeConfiguration<MechanicalJobcard>
{
    public void Configure(EntityTypeBuilder<MechanicalJobcard> mechanicalJobcardConfig)
    {
        mechanicalJobcardConfig.HasOne(j => j.Vehicle).WithOne(v => v.MechanicalJobcard).HasForeignKey<MechanicalJobcard>(j => j.VehicleId);
    }
}

在Migrations文件中得到重复的VehicleId键(VehicleIdVehicleId1):

 table.ForeignKey(
    name: "FK_jobcard_vehicles_VehicleId",
    column: x => x.VehicleId,
    principalSchema: "dbo",
    principalTable: "vehicles",
    principalColumn: "VehicleId",
    onDelete: ReferentialAction.Cascade);
table.ForeignKey(
    name: "FK_jobcard_vehicles_VehicleId1",
    column: x => x.VehicleId,
    principalSchema: "dbo",
    principalTable: "vehicles",
    principalColumn: "VehicleId",
    onDelete: ReferentialAction.Cascade);
托德·斯凯尔顿

我创建了一个完整的工作示例,该示例在创建初始迁移时没有任何问题。它们映射到相同的表并使用相同的外键。

添加HasBaseType可能是问题所在。这将指示EF这两个实体共享基本类型。

class Program
{
    static void Main()
    {

    }

    public class Vehicle
    {
        public int Id { get; set; }
        public PanelBeatingJobcard PanelBeatingJobcard { get; set; }
        public MechanicalJobcard MechanicalJobcard { get; set; }
    }

    public abstract class Jobcard
    {
        public int Id { get; set; }
        public int VehicleId { get; set; }
        public Vehicle Vehicle { get; set; }
    }

    public class PanelBeatingJobcard : Jobcard { }

    public class MechanicalJobcard : Jobcard { }

    public class Context: DbContext
    {
        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            optionsBuilder.UseSqlServer();
        }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<MechanicalJobcard>(buildAction =>
            {
                buildAction.HasBaseType<Jobcard>();
                buildAction.HasOne(e => e.Vehicle).WithOne(e => e.MechanicalJobcard).HasForeignKey<MechanicalJobcard>(e => e.VehicleId);
            });

            modelBuilder.Entity<PanelBeatingJobcard>(buildAction =>
            {
                buildAction.HasBaseType<Jobcard>();
                buildAction.HasOne(e => e.Vehicle).WithOne(e => e.PanelBeatingJobcard).HasForeignKey<PanelBeatingJobcard>(e => e.VehicleId);
            });
        }
    }
}

迁移输出

public partial class InitialMigration : Migration
{
    protected override void Up(MigrationBuilder migrationBuilder)
    {
        migrationBuilder.CreateTable(
            name: "Vehicle",
            columns: table => new
            {
                Id = table.Column<int>(type: "int", nullable: false)
                    .Annotation("SqlServer:Identity", "1, 1")
            },
            constraints: table =>
            {
                table.PrimaryKey("PK_Vehicle", x => x.Id);
            });

        migrationBuilder.CreateTable(
            name: "Jobcard",
            columns: table => new
            {
                Id = table.Column<int>(type: "int", nullable: false)
                    .Annotation("SqlServer:Identity", "1, 1"),
                VehicleId = table.Column<int>(type: "int", nullable: false),
                Discriminator = table.Column<string>(type: "nvarchar(max)", nullable: false)
            },
            constraints: table =>
            {
                table.PrimaryKey("PK_Jobcard", x => x.Id);
                table.ForeignKey(
                    name: "FK_Jobcard_Vehicle_VehicleId",
                    column: x => x.VehicleId,
                    principalTable: "Vehicle",
                    principalColumn: "Id",
                    onDelete: ReferentialAction.Cascade);
            });

        migrationBuilder.CreateIndex(
            name: "IX_Jobcard_VehicleId",
            table: "Jobcard",
            column: "VehicleId",
            unique: true);
    }

    protected override void Down(MigrationBuilder migrationBuilder)
    {
        migrationBuilder.DropTable(
            name: "Jobcard");

        migrationBuilder.DropTable(
            name: "Vehicle");
    }
}

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

接口继承层次结构

来自分类Dev

如何在ASP.NET Identity 2中使用TPH(每个层次结构的表)

来自分类Dev

将平面表转换为层次结构

来自分类Dev

将平面表转换为层次结构

来自分类Dev

将产品层次结构加入客户表

来自分类Dev

将Weka树转换为SQL层次表的层次结构

来自分类Dev

将Weka树转换为SQL层次表的层次结构

来自分类Dev

将JPA实体映射到继承层次结构

来自分类Dev

复制并遍历继承层次结构

来自分类Dev

按继承层次结构解析

来自分类Dev

查找每个节点的层次结构

来自分类Dev

何时在每个子类的表之上使用每个类的表层次结构?

来自分类Dev

使用单表继承的实体层次结构上的JPA标准查询

来自分类Dev

UrlClassLoader委托和继承层次结构

来自分类Dev

PostSharp和方面通过层次结构继承

来自分类Dev

关于继承层次结构的Java getMethods()

来自分类Dev

PostSharp和方面通过层次结构继承

来自分类Dev

在继承层次结构中移动构造函数

来自分类Dev

从两个层次结构接口继承?

来自分类Dev

用于ContextRefreshEvent的Spring ApplicationListener。如何在每个层次结构中仅调用一次?

来自分类Dev

我需要在主子关系中进行 2 个层次的继承和抽象

来自分类Dev

从平面表生成层次结构

来自分类Dev

PostgreSQL表中的层次结构

来自分类Dev

类层次结构哈希表

来自分类Dev

在Ruby中,如何在层次结构中的特定级别运行对象的每个方法(而不是它继承的方法)?

来自分类Dev

继承层次结构中的特定类,如boost :: signal2回调中的类型

来自分类Dev

将一组父子关系转变为层次结构

来自分类Dev

SSAS中的维度层次结构(多个关系?)

来自分类Dev

对于员工表中的每个员工,在层次结构中找到直接和间接老板的数量

Related 相关文章

  1. 1

    接口继承层次结构

  2. 2

    如何在ASP.NET Identity 2中使用TPH(每个层次结构的表)

  3. 3

    将平面表转换为层次结构

  4. 4

    将平面表转换为层次结构

  5. 5

    将产品层次结构加入客户表

  6. 6

    将Weka树转换为SQL层次表的层次结构

  7. 7

    将Weka树转换为SQL层次表的层次结构

  8. 8

    将JPA实体映射到继承层次结构

  9. 9

    复制并遍历继承层次结构

  10. 10

    按继承层次结构解析

  11. 11

    查找每个节点的层次结构

  12. 12

    何时在每个子类的表之上使用每个类的表层次结构?

  13. 13

    使用单表继承的实体层次结构上的JPA标准查询

  14. 14

    UrlClassLoader委托和继承层次结构

  15. 15

    PostSharp和方面通过层次结构继承

  16. 16

    关于继承层次结构的Java getMethods()

  17. 17

    PostSharp和方面通过层次结构继承

  18. 18

    在继承层次结构中移动构造函数

  19. 19

    从两个层次结构接口继承?

  20. 20

    用于ContextRefreshEvent的Spring ApplicationListener。如何在每个层次结构中仅调用一次?

  21. 21

    我需要在主子关系中进行 2 个层次的继承和抽象

  22. 22

    从平面表生成层次结构

  23. 23

    PostgreSQL表中的层次结构

  24. 24

    类层次结构哈希表

  25. 25

    在Ruby中,如何在层次结构中的特定级别运行对象的每个方法(而不是它继承的方法)?

  26. 26

    继承层次结构中的特定类,如boost :: signal2回调中的类型

  27. 27

    将一组父子关系转变为层次结构

  28. 28

    SSAS中的维度层次结构(多个关系?)

  29. 29

    对于员工表中的每个员工,在层次结构中找到直接和间接老板的数量

热门标签

归档