我目前在使用下面的简单模型。这非常简单:我们有资源,他们可以是Room
,EmptyOffice
(...)或Service
。实体框架核心2.0中的几个子实体中的相同属性名称
Room
和EmptyOffice
可以有容量,但不是Service
。
public abstract class Resource : Entity
{
public string Name { get; set; }
}
public class Room : Resource
{
public int Capacity { get; set; }
}
public class EmptyOffice : Resource
{
public int Capacity { get; set; }
}
public class Service : Resource
{ }
要想从我的SQL视图中的数据,我用的映射:
builder.Entity<Resource>(m =>
{
m.ToTable("resource", "facility");
m.HasKey(x => x.Id);
m.Property(x => x.Id)
.HasColumnName("ResourceId");
m.Property(x => x.Type)
.HasColumnName("ResourceTypeId");
m.HasDiscriminator(x => x.Type)
.HasValue<Room>(ResourceType.Room)
.HasValue<EmptyOffice>(ResourceType.EmptyOffice)
.HasValue<Service>(ResourceType.Service);
});
builder.Entity<Room>();
builder.Entity<EmptyOffice>();
builder.Entity<Service>();
当我运行我的代码,EF核心抛出以下异常:
System.Data .SqlClient.SqlException:'无效的列名'Room_Capacity'。'
如果我将Capacity
属性重命名为Room_Capacity
,它可以工作,但它很可怕。
如何强制EF Core 2.0针对每个子实体的容量属性?
谢谢 塞巴斯蒂安
您是否使用EF Core 2.0迁移创建数据库? – Smit
没有。我正在使用现有的数据库。 – Seb
您可以在数据库中共享您的表结构的详细信息。这里的问题是,EF会创建一些与您现有的数据库不匹配的数据库结构。如果你共享数据库模型,我们可以找到缺失的部分。 – Smit