实体类型没有定义键 - 代码优先

时间:2013-04-25 06:35:54

标签: asp.net-mvc entity-framework-4

我是MVC以及实体框架的新手。我搜索了很多并找到了几个类似的问题(例如Entity Type Has No Key Defined),但它们并没有解决我的问题。

namespace MvcAppInvoice.Models
{
    public class Customer
    {
        public int CustomerID { get; set; }
        public string FirstName { get; set; }
        public string SurName { get; set; }
        public virtual CustomerType Type { get; set; }
    }

    public class CustomerType
    {
        public int TypeId { get; set; }
        public string TypeName { get; set; }
        public virtual ICollection<Customer> customers { get; set; }
    }
}

Add Controller

当我尝试添加控制器时,它会出现以下错误:

Error

4 个答案:

答案 0 :(得分:14)

通常,如果属性名为IdTypeName+Id,则首先按惯例隐式设置代码实体类型的密钥。在您的情况下,TypeId不属于他们,因此您应使用KeyAttribute或使用流利的语法,使用EntityTypeConfiguration.HasKey Method

明确地将其标记为关键

答案 1 :(得分:1)

我遇到了同样的问题。在我找到适合我的解决方案之前,我重新启动了该项目3次。我手动创建了一个名为UserContext的公共类。当我运行向导以添加ADO类时,向导生成了一个UserContext的部分类。我删除了我的usercontext类,并修改了VS为我生成的类。

namespace UserLayer.Models
{
    using System;
    using System.Data.Entity;
    using System.Data.Entity.Infrastructure;

    public class UserContext : DbContext
    {

        public DbSet<UserDetail> UserDetails { get; set; }
    }
}

现在它可能在没有修改的情况下工作了。也许删除我的课程版本会有效。我不知道。在retropect中,当我尝试添加控制器时遇到了错误。我怀疑这是VS2012中的一个错误,因为可能存在部分类和同名的公共类。目的是允许程序员扩展分部类的定义。

答案 2 :(得分:1)

添加名称空间

using System.ComponentModel.DataAnnotations;

将key属性添加到CustomerID 像这样

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

然后构建应用程序并尝试添加控制器。这将有效

答案 3 :(得分:0)

运行所选代码生成器时出错,无法检索实体类型的元数据,但未定义任何键。

  • 一个更重要的事情sql表只需要[Id]然后实体 如果您使用其他主键,如[MenuId],它将起作用 惯于。
  • 您应该在Model上添加验证,即Key和Column order
  • 列顺序= 1,因为在[key]之后将其增量加1表示# 为什么

模型

[Key]
        [Column(Order = 1)]
        public int RoleIdName { get; set; }

然后在实体框架下创建一个控制器之后构建它,它将起作用

我希望它有所帮助。