我有两个简单的课程:
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?
答案 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));