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无法与数据库通信。
希望能帮助到你