我是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; }
}
}
当我尝试添加控制器时,它会出现以下错误:
答案 0 :(得分:14)
通常,如果属性名为Id
或TypeName+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)
运行所选代码生成器时出错,无法检索实体类型的元数据,但未定义任何键。
模型
[Key]
[Column(Order = 1)]
public int RoleIdName { get; set; }
然后在实体框架下创建一个控制器之后构建它,它将起作用
我希望它有所帮助。