单表继承中的Is Discriminator实体框架问题

时间:2011-06-29 14:04:10

标签: c# entity-framework entity-framework-4.1

我有两个简单的课程:

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?

1 个答案:

答案 0 :(得分:1)

您正在使用来自错误命名空间的Column属性 - 它是Linq-to-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));