C# 由于继承类ASP.NET MVC VS2015上没有PK,新控制器验证错误

C# 由于继承类ASP.NET MVC VS2015上没有PK,新控制器验证错误,c#,asp.net-mvc,entity-framework,inheritance,visual-studio-2015,C#,Asp.net Mvc,Entity Framework,Inheritance,Visual Studio 2015,我正在尝试通过RMB>add>controller在VS2015中添加控制器。。。选项我尝试添加一个带有视图的MVC控制器,收到以下错误消息 运行所选代码生成器时出错:“无法检索”myNamespace.Service“的元数据。在模型生成过程中检测到一个或多个验证错误: ImageService::EntityType“ImageService未定义键。请定义此EntityType的键。” 我知道这是因为EF中的每个模型都需要一个键,但这些类是Image类的子类,因此不应该有它们自己的PK,因

我正在尝试通过RMB>add>controller在VS2015中添加控制器。。。选项我尝试添加一个带有视图的MVC控制器,收到以下错误消息

运行所选代码生成器时出错:“无法检索”myNamespace.Service“的元数据。在模型生成过程中检测到一个或多个验证错误:

ImageService::EntityType“ImageService未定义键。请定义此EntityType的键。”

我知道这是因为EF中的每个模型都需要一个键,但这些类是Image类的子类,因此不应该有它们自己的PK,因为PK是从父级派生的,因为TPH无论如何都会将所有这些合并到一个DB表中

此外,[NotMap]在此处不适用,因为FK字段(以及要添加的任何其他字段)将需要映射

我的图像类父代码如下:

public abstract class Image
{
    public int ImageID { get; set; }

    [Required]
    public string Location { get; set; }

    [Required]
    public ImageType Type { get; set; }

    [Required]
    public DateTime Created { get; set; } = DateTime.Now;

    [Required]
    public DateTime LastModified { get; set; } = DateTime.Now;

    [Required]
    public bool Deleted { get; set; } = false;

    [Timestamp]
    public byte[] RowVersion { get; set; }

    //*********** Static Public Fields *********
    public static string defaultImgLocation = "/Storage/Global/NoImg.jpg";

    public Image()
    {

    }

    public Image(ImageType type, string imgLocation, HttpPostedFileBase file)
    {
        Location = saveImage(imgLocation, file);
        Type = type;
    }
导致问题的子类:

public class ImageService : Image
{
    [ForeignKey("Service")]
    public int ServiceID { get; set; }

    public Service Service { get; set; }

    public ImageService() : base()
    {

    }

    public ImageService(HttpPostedFileBase file, ImageType imgType, string imgLocation, Service svcObj) : base(imgType, imgLocation, file)
    {
        Service = svcObj;
    }
}
还有许多其他的子类,有些子类中有额外的字段,有些子类中没有任何额外的字段


任何帮助都将不胜感激。

将[Key]数据注释添加到图像类中的ImageID属性也是TPH设置正确的,例如,派生上下文只包含类似于
public DbSet Images{get;set;}的内容
?Ivan,谢谢你的评论。这是正确的。为TPHSparrow设置了上下文,谢谢你的评论。事实证明你是对的!你知道为什么我必须用Key属性显式标记PK吗?我的命名约定符合EF的PK命名约定,因此EF知道这是PK,并将其视为PK,当然是VS shoULD也知道这一点,但可能是重要的:许多其他的子类都使用了继承的不当用法。考虑合成(在数据库模式方面:进一步规范化)。另一个故事是<代码> IVIDESGRADION/<代码>作为代码类>图像< /代码>的子类。