10

我是 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; }
    }
}

添加控制器

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

错误

4

4 回答 4

14

Id通常,如果属性名为or ,则代码优先按约定隐式设置实体类型的键TypeName+Id。在您的情况下,TypeId它们都不是,因此您应该使用KeyAttribute或使用流畅的语法,使用EntityTypeConfiguration.HasKey 方法将其明确标记为键

于 2013-04-25T07:16:38.473 回答
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; }
    }
}

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

于 2013-11-24T17:41:39.550 回答
1

添加命名空间

using System.ComponentModel.DataAnnotations;

像这样将关键属性添加到您的 CustomerID

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

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

于 2017-02-18T11:57:21.877 回答
0

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

  • 更重要的一件事是 sql 表只需要 [Id] 如果您使用其他主键,例如 [MenuId],实体框架将起作用,但它不会。
  • 您应该在模型上添加验证,即键和列顺序
  • column order = 1 因为在 [key] 将其增量增加 1 这就是为什么

模型

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

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

我希望它有帮助。

于 2017-07-28T11:36:36.293 回答