C# 由于继承类ASP.NET MVC VS2015上没有PK,新控制器验证错误
我正在尝试通过RMB>add>controller在VS2015中添加控制器。。。选项我尝试添加一个带有视图的MVC控制器,收到以下错误消息 运行所选代码生成器时出错:“无法检索”myNamespace.Service“的元数据。在模型生成过程中检测到一个或多个验证错误: ImageService::EntityType“ImageService未定义键。请定义此EntityType的键。” 我知道这是因为EF中的每个模型都需要一个键,但这些类是Image类的子类,因此不应该有它们自己的PK,因为PK是从父级派生的,因为TPH无论如何都会将所有这些合并到一个DB表中 此外,[NotMap]在此处不适用,因为FK字段(以及要添加的任何其他字段)将需要映射 我的图像类父代码如下: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,因
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/<代码>作为代码类>图像< /代码>的子类。