单表继承中IsDiscriminator的EntityFramework问题

本文关键字:EntityFramework 问题 IsDiscriminator 继承 单表 | 更新日期: 2023-09-27 18:00:53

我有两个简单的类:

public abstract class Device
{
    public int DeviceID { get; set; }
    public string SerialNumber { get; set; }
    [Column(IsDiscriminator = true)]
    public int DeviceTypeID { get; set; }
}
public class SomeDevice : Device
{
    public string SomeAdditionalInfo { get; set; }
}

所有内容都存储在一个表中:

DeviceID|SerialNumber|DeviceTypeID|SomeAdditionalInfo

但在应用程序中,我在检索数据时遇到了下一个异常:

Invalid column name 'Discriminator'.

如果我将列DeviceTypeID更改为Discriminator,则一切正常。为什么属性IsDiscriminator=true被忽略?

单表继承中IsDiscriminator的EntityFramework问题

您使用的Column属性来自错误的命名空间-它是Linq到Sql的属性。实体框架中的鉴别器从未映射为属性-EF将自动创建该列。所以,除非您正在使用现有的数据库,否则您应该简单地使用:

public abstract class Device
{
    public int DeviceID { get; set; }
    public string SerialNumber { get; set; }
}

在现有数据库的情况下,您必须使用流利的API。在派生上下文中,将其添加到OnModelCreating:

modelBuilder.Entity<Device>()
            .Map<SomeDevice>(m => m.Requires("DeviceTypeID")
                                   .HasValue(10));