繁体   English   中英

与Entity Framework Core 2.0的多个子实体中的属性名称相同

[英]Same property name in several child entities with Entity Framework Core 2.0

我目前正在使用下面的简单模型。 这很简单:我们有资源,它们可以是RoomEmptyOffice (...)或Service

RoomEmptyOffice可以容纳,但不能容纳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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM