[英]Same property name in several child entities with Entity Framework Core 2.0
我目前正在使用下面的简单模型。 这很简单:我们有资源,它们可以是Room
, EmptyOffice
(...)或Service
。
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 Core会引发以下异常:
System.Data.SqlClient.SqlException:'无效的列名'Room_Capacity'。
如果我将Capacity
属性重命名为Room_Capacity
,那么它可以工作,但是太可怕了。
如何强制EF Core 2.0定位每个子实体的容量属性?
谢谢你塞巴斯蒂安
您不能这样做,因为EF Core中唯一可用的继承模式是每个类层次结构的表。 如果使用接口而不是基类,则可以,但是每个实体都将映射到不同的表。 使用[NotMapped]标记任何要排除的属性,或者使用代码标记“忽略”。
这为我工作:
builder.Entity<Room>().Property(a => a.Capacity).HasColumnName("Capacity");
builder.Entity<EmptyRoom>().Property(a => a.Capacity).HasColumnName("Capacity");
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.