EF Core 表拆分 - 一张表到多个类

问题描述 投票:0回答:2

我的表格有四列,我想将其拆分为多个类。

table1
 key
 col1
 col2
 col3
 col4

Class ClassA 
  key
  col1
  col2

class ClassB
   key
   col3
   col4

modelBuilder.Entity().ToTable(“table1”);
modelBuilder.Entity().ToTable("table1");

目前它给了我

System.InvalidOperationException:“无法将表“table1”用于实体类型“ClassB”,因为它正用于实体类型“ClassA”

在 EF Core 中可以吗?

谢谢

c# ef-core-2.0
2个回答
1
投票

您可能需要基于此 MS 文档定义如下关系:

modelBuilder.Entity<ClassA>()
    .HasOne(e => e.ClassB).WithOne(e => e.ClassA)
    .HasForeignKey<ClassB>(e => e.Key);
modelBuilder.Entity<ClassA>().ToTable("Products");
modelBuilder.Entity<ClassB>().ToTable("Products");

1
投票

您可以为 ClassAClassB 定义基类:

abstract class ClassBase
{
    public int Key { get; set; }
}

public class ClassA : ClassBase
{
    public int Col1 { get; set; }
    public int Col2 { get; set; }
}

public class ClassB : ClassBase
{
    public int Col3 { get; set; }
    public int Col4 { get; set; }
}

然后您可以定义以下映射:

    modelBuilder.Entity<ClassA>().HasBaseType<ClassBase>();
    modelBuilder.Entity<ClassB>().HasBaseType<ClassBase>();

这将创建表列:

  • 钥匙
  • Col1(可为空)
  • Col2(可为空)
  • Col3(可为空)
  • Col4(可为空)
  • 鉴别器

Discriminator列用于确定实体的类型。您可以通过 HasDiscriminator 方法控制此列。您可以使用例如:

,而不是像上面那样定义实体
    modelBuilder.Entity<ClassBase>().HasDiscriminator<int>("ClassType")
                .HasValue<ClassA>(1)
                .HasValue<ClassB>(2);
© www.soinside.com 2019 - 2024. All rights reserved.