【问题标题】:EF Core Table Splitting - One table to multiple classesEF Core 表拆分 - 一个表到多个类
【发布时间】:2018-12-17 07:53:44
【问题描述】:

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

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: 'Cannot use table 'table1' for entity type 'ClassB' because it is used for entity type 'ClassA'

在 EF Core 中可以吗?

谢谢

【问题讨论】:

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


    【解决方案1】:

    您可能需要基于this MS docs 定义如下关系:

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

    【讨论】:

      【解决方案2】:

      您可以为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);
      

      【讨论】:

        猜你喜欢
        • 2020-06-25
        • 2018-09-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-02-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多