【问题标题】: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】:
您可以为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);