首页 > 解决方案 > 在实体框架中使用继承时是否可以重命名或配置鉴别器列?

问题描述

我有一个包含我的 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 { }

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

目前,当我开始使用继承时,数据库迁移仍然希望使用鉴别器列。

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

标签: entity-framework-6

解决方案


这是可能的,虽然不是那么直观(恕我直言,对于 EF 设计人员来说,这可能看起来合乎逻辑且显而易见)。

您需要使用流畅的 API 并对所有Map派生类型重复(如果不是,则还需要基类型)。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())
    ;

推荐阅读