EntityType'Category'没有定义键。 定义这个EntityType的关键

开发一个基本的ASP.net MVC 4应用程序。 它是一个简单的产品目录应用程序,在我有2个数据库表(“类别”和“产品”)

“产品”表中有“类别ID”(类别表中的主键)的外键引用。

当我运行应用程序,我得到错误信息(下面列出)。

System.Data.Entity.Edm.EdmEntityType: : EntityType 'Category' has no key defined. Define the key for this EntityType. System.Data.Entity.Edm.EdmEntitySet: EntityType: EntitySet 'Category' is based on type 'Category' that has no keys defined 

这看起来像一个新手常见的错误,我没有检查所有相关的解决scheme,“实体键”没有定义的键。 但仍然是我的问题没有解决,请帮助我理解这个问题,以及这个问题的正确解决scheme是什么。

以下是我的模型类

Category.cs

 namespace ChemicalStore.Models { public partial class Category { public int CatId { get; set; } public string CatName { get; set; } public string CatDescription { get; set; } public List<Product> Product { get; set; } } } 

Products.cs

 namespace ChemicalStore.Models { public class Product { public int ProductId { get; set; } public int CatId { get; set; } public string ProductTitle { get; set; } public string ProductPrice { get; set; } public string ProductDescription { get; set; } public string ProductPackage { get; set; } } } 

您应该在属性CatId之前添加属性[Key]:

  public partial class Category { [Key] public int CatId { get; set; } public string CatName { get; set; } public string CatDescription { get; set; } public List<Product> Product { get; set; } } 

问题是EF只有知道表的主键时才能工作。 默认情况下,EF将其识别为名称为ID的主键属性。 如果您的表具有另一个主键,则可以使用属性[Key]标记它,或者使用stream畅configuration设置Key。

entity framework使用主键字段在生成的表上创build主键列。

它使用约定来得到这个列有一些变化:

  • 如果该字段被称为id或任何套pipe方差;
  • 如果该字段被称为任何套pipe方差的ClassNameId ;

我可能会错过一些更多的约定,但这些是最常见的情况。

如果你没有这个约定的任何字段,你需要用属性[Key]标记你想要的主键:

 [Key] public int CatId { get; set; } 

只需将[key]属性放在上面的id上即可

 [Table("employee")] public class Employee { [Key] public int Empno { set; get; } public string Empname { set; get; } } 

我能够通过给我的关键属性添加一个setter来解决这个问题。 我以前只有一个getter。

 public int Id { get; set; } 

实体类是自动生成的

如果代码重新生成,手动更改这些文件将被覆盖。

您需要使用所有元数据创build一个部分类

  [MetadataType(typeof(Category.CategoryMetadata))] public partial class Category { internal sealed class CategoryMetadata { [Key] public int CatId { get; set; } [Required] public string CatName { get; set; } public string CatDescription { get; set; } public List<Product> Product { get; set; } } } 

阅读更多关于MSDN

嗨,如果你得到低于错误。 “”在模型生成期间检测到一个或多个validation错误:

Checking.Models.Employee :: EntityType'Employee'没有定义键。 定义这个EntityType的关键。“”只是检查你的表列名和定义的属性名是否相同。 如果没有,那么纠正它的问题解决。

在我的情况下,我解决了这个问题,在web.config / app.config文件中添加正确的connectionString。

我忘了添加它,DBContext无法与数据库通信。

希望能帮助到你