2017-09-06 72 views
0

我目前在使用下面的简单模型。这非常简单:我们有资源,他们可以是RoomEmptyOffice(...)或Service实体框架核心2.0中的几个子实体中的相同属性名称

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核心抛出以下异常:

System.Data .SqlClient.SqlException:'无效的列名'Room_Capacity'。'

如果我将Capacity属性重命名为Room_Capacity,它可以工作,但它很可怕。

如何强制EF Core 2.0针对每个子实体的容量属性?

谢谢 塞巴斯蒂安

+0

您是否使用EF Core 2.0迁移创建数据库? – Smit

+0

没有。我正在使用现有的数据库。 – Seb

+0

您可以在数据库中共享您的表结构的详细信息。这里的问题是,EF会创建一些与您现有的数据库不匹配的数据库结构。如果你共享数据库模型,我们可以找到缺失的部分。 – Smit

回答

0

你不能这样做,因为在EF核心唯一可用的遗传模式为每类层次结构表。如果你使用接口而不是基类,你可以,但是每个实体将被映射到不同的表。用[NotMapped]标记要排除的任何属性,或者使用代码与Ignore标记。

+0

其实我想通过我的视图将Room/EmptyOffice的容量属性映射到容量列。如果我试着用上面的代码来做到这一点,我会得到有关Room_capacity的异常。我的猜测是,实体框架连接实体类型+属性名称来区分Room.Capacity从EmptyOffice.Capacity。我不知道为什么它需要做... – Seb

+0

你不能这么做,因为EF Core中唯一可用的继承模式是每个类层次结构的表。如果你使用接口而不是基类,你可以,但是每个实体将被映射到不同的表。我的坏,对不起! –

+0

我明白了,所以我需要使用后台字段并将容量属性标记为NonMapped。是的,这是有道理的;) – Seb