开发基本的ASP.net MVC 4应用程序。它是一个简单的产品目录应用程序,我在其中有2个数据库表('Category'和'Products')
'Products'表中有'Category id'(Category表中的主键)的外键引用。
当我运行应用程序时,我收到错误消息(如下所示)。
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
这看起来像新手的常见错误,我确实检查了所有相关的解决方案'实体键''没有定义键。但仍然我的问题没有解决,请帮助我理解这个问题以及解决这个问题的正确方法。
以下是我的模型类
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; }
}
}
答案 0 :(得分:77)
您应该在属性CatId:
之前添加属性[Key] using System.ComponentModel.DataAnnotations;
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]标记它,或者使用流畅的配置设置Key。
答案 1 :(得分:12)
Entity Framework使用主键字段在生成的表上创建主键列。
它使用约定来为此列添加一些变体:
id
或任何套管差异; ClassNameId
; 我可能会遗漏更多的约定,但这些是最常见的情况。
如果您没有此约定的任何字段,则需要使用属性[Key]
标记所需的主键:
[Key]
public int CatId { get; set; }
答案 2 :(得分:8)
我能够通过在我的key属性中添加一个setter来解决这个问题。我之前只有一个吸气剂。
public int Id { get; set; }
答案 3 :(得分:7)
只需将[key]属性放在上面的id ..
[Table("employee")]
public class Employee
{
[Key]
public int Empno { set; get; }
public string Empname { set; get; }
}
答案 4 :(得分:0)
实体类是自动生成的..
如果重新生成代码,将覆盖对这些文件的手动更改。
您需要创建包含所有元数据的部分类
[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
答案 5 :(得分:0)
嗨,如果你得到以下错误。 &#34;&#34;在模型生成期间检测到一个或多个验证错误:
Checking.Models.Employee :: EntityType&#39; Employee&#39;没有定义键。定义此EntityType的密钥。&#34;&#34; 只需检查您的表列名称和定义的属性名称是否相同。 如果没有那么纠正它解决了问题。