EF核心表拆分 - 一个表到多个类

时间:2017-12-07 02:47:01

标签: c# ef-core-2.0 table-splitting

我的表有四列,我想在多个类之间拆分。

table1
 key
 col1
 col2
 col3
 col4

Class ClassA 
  key
  col1
  col2

class ClassB
   key
   col3
   col4

modelBuilder.Entity()ToTable("表1&#34);。
。modelBuilder.Entity()ToTable("表1&#34);

目前它给了我

System.InvalidOperationException:'无法使用表' table1'对于实体类型' ClassB'因为它被用于实体类型' ClassA'

是否可以在EF Core中使用?

由于

2 个答案:

答案 0 :(得分:1)

根据REST API Developer Guide

,您可能需要一个如下定义的关系
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 :(得分:0)

您可以为 ClassA ClassB 定义基类:

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);