每个层次表(TPH)鉴别器值

时间:2014-07-24 10:51:00

标签: entity-framework entity-framework-6.1

我们正在使用流畅的API将域模型映射到现有数据库。

数据库有一个名为Discriminator的列,但列中存储的值与行所涉及的类型不相同。

假设:

public class Vehicle
{
    public int Id { get; set; }
}

public class Car : Vehicle
{
    public int Doors { get; set; }
}

public class Bike : Vehicle
{
    public bool Stubby { get; set; }
}

任何人都可以告诉我为什么有效:

public class VehicleMapping : EntityTypeConfiguration<Vehicle>
{
    public VehicleMapping()
    {
        HasKey(x => x.Id);
        Property(x => x.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);

        Map<Car>(x => x.Requires("Discriminato").HasValue("C"));
        Map<Bike>(x => x.Requires("Discriminato").HasValue("B"));
    }
}

并且(只是需要位已更改)

public class VehicleMapping : EntityTypeConfiguration<Vehicle>
{
    public VehicleMapping()
    {
        HasKey(x => x.Id);
        Property(x => x.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);

        Map<Car>(x => x.Requires("Discriminator").HasValue("C"));
        Map<Bike>(x => x.Requires("Discriminator").HasValue("B"));
    }
}

修改

对不起,澄清一下我在问什么:

为什么无法使用默认列名,但更改该列中存储的值/类型?

有可能吗?
如果没有解决方法吗? (除了更改我们的架构)

1 个答案:

答案 0 :(得分:0)

实体框架TPH默认使用名为Discriminator的列,而您的第二个代码块正在弄乱该列。来自MSDN

  

默认情况下,将鉴别器列添加到表中   名称“Discriminator”和每种类型的CLR类型名称   层次结构用于鉴别器值。你可以修改   使用Fluent API的默认行为。

因此,如果您需要对其进行修改,则需要为第一个代码块正在执行的列选择您自己的名称并将其命名为Discriminato