在实体框架中使用iheritance时,是否可以重命名或配置鉴别器列



我有一个数据库,其中有一个表,包含我的POCO类的列

public class TypeOf
{
[Key, Column(Order = 0)]
public string Type { get; set; }
[Key, Column(Order = 1)]
public string Key { get; set; }
public string Value { get; set; }
}

这个表已经包含了很多数据

HsCode | HP | 4821 1000
SubCode | 423 | T21
SubCode | 022 | 5XL
ProductionLine | X1 | Line one
ProductionLine | X2 | Line two
Country | CN | China
Country | IN | India
…

我想通过创建TypeOf 的继承系统来改进这一点

public class Country : TypeOf { }
public class ProductionLine : TypeOf { }
public class SubCode : TypeOf { }
public class HsCode : TypeOf { }

通过使用"类型"列作为鉴别器。

现在,当我开始使用继承时,数据库迁移仍然希望使用Discriminator列。

public partial class TypeOf : DbMigration
{
public override void Up()
{
AddColumn("dbo.TypeOfs", "Discriminator", c => c.String(nullable: false, maxLength: 128));
}
public override void Down()
{
DropColumn("dbo.TypeOfs", "Discriminator");
}
}

这是可能的,尽管不是那么直观(IMHO,对于EF设计师来说,这可能看起来合乎逻辑且显而易见(。

您需要使用Mapfluent API,并对所有派生类型重复Requires(e => e.Type).HasValue()(如果不是abstract,还需要重复基类型(。

对于来自帖子的样本模型,它应该是:

modelBuilder.Entity<TypeOf>()
.Map(m => m.Requires(e => e.Type).HasValue())
.Map<Country>(m => m.Requires(e => e.Type).HasValue())
.Map<ProductionLine>(m => m.Requires(e => e.Type).HasValue())
.Map<SubCode>(m => m.Requires(e => e.Type).HasValue())
.Map<HsCode>(m => m.Requires(e => e.Type).HasValue())
;

最新更新