37

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

'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

这对于新手来说似乎是一个常见错误,我确实检查了“实体键”的所有相关解决方案没有定义键。但我的问题仍然没有解决,请帮助我理解这个问题以及这个问题的正确解决方案是什么。

以下是我的模型类

类别.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; }
    }     
}

产品.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; }
    }
}
4

7 回答 7

79

您应该在属性 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。

于 2012-12-13T14:35:22.097 回答
13

Entity Framework 使用主键字段在生成的表上创建主键列。

它使用约定来获得具有一些变化的此列:

  • 如果该字段被调用id或任何大小写差异;
  • 如果该字段被称为ClassNameId任何大小写差异;

我可能会遗漏一些约定,但这些是最常见的情况。

如果您没有任何具有此约定的字段,则需要使用属性标记所需的主键[Key]

[Key]
public int CatId { get; set; }
于 2012-12-13T14:37:07.380 回答
8

我可以通过向我的 key 属性添加一个 setter 来解决这个问题;我以前只有一个吸气剂。

public int Id { get; set; }
于 2016-02-03T18:05:12.527 回答
7

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

[Table("employee")]

public class Employee
{ 

    [Key]

    public int Empno { set; get; }

    public string Empname { set; get; }      
}
于 2014-05-23T02:50:59.410 回答
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上阅读更多信息

于 2015-03-17T14:31:09.703 回答
0

嗨,如果您遇到错误。""在模型生成过程中检测到一个或多个验证错误:

Checking.Models.Employee: : EntityType 'Employee' 没有定义键。定义此 EntityType 的键。"" 只需检查您的表列名称和定义的属性名称是否相同。如果不是,则更正它问题已解决。

于 2015-07-26T13:30:20.953 回答
0

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

我忘记添加它并且 DBContext 无法与数据库通信。

希望能帮助到你

于 2015-08-24T20:21:04.377 回答