【问题标题】:EntityType 'Category' has no key defined. Define the key for this EntityType [duplicate]EntityType 'Category' 没有定义键。定义此 EntityType 的键 [重复]
【发布时间】:2012-12-13 14:32:05
【问题描述】:

开发一个基本的 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; }
    }
}

【问题讨论】:

  • hmm..为什么这个问题被标记为后面问题的重复?

标签: asp.net-mvc entity-framework


【解决方案1】:

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

【讨论】:

  • 完全同意。按照惯例,MVC 将期望一个名为“CategoryId”的属性,但您改为放置“CatId”,因此您需要使用数据注释并为“CatId”放置 [Key] 以让 MVC 知道这是模型类别的主键。
  • 非常感谢,我是新手,这让我不再感到沮丧。
  • 我有同样的错误。但我确认我尊重约定我的财产是public int AccountRoleId你还有其他想法吗?
【解决方案2】:

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

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

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

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

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

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

【讨论】:

    【解决方案3】:

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

    public int Id { get; set; }
    

    【讨论】:

    • 我发现缺少 getter/setter 也会触发这个异常。将其与“Key”属性一起放置
    • 一个private set就够了
    【解决方案4】:

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

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

    【讨论】:

      【解决方案5】:

      实体类是自动生成的..

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

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

          [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

      【讨论】:

      • OP 似乎正在使用代码优先的方法。所以这个答案不适用。
      【解决方案6】:

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

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

      【讨论】:

        【解决方案7】:

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

        我忘记添加了,DBContext 无法与 DB 通信。

        希望对你有帮助

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-04-02
          • 2016-03-16
          • 2013-08-04
          • 2012-12-10
          • 2016-09-26
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多