C# 尽管定义了键,EntityType没有键定义错误
我将遵循此处列出的教程: 使用我的VS2015企业IDE 但是,在步骤8中,我右键单击OrderController中的List ActionResult并选择Add View(添加视图),如下所示: 我得到以下错误: 但是在本教程中,他们没有为OrderVM使用密钥。即使我添加了[Key]和正确的使用方法,并且在重建之后,我仍然会得到相同的错误,我完全不知道为什么要使用getter和setter 视图模型: OrderVM 勤务主任C# 尽管定义了键,EntityType没有键定义错误,c#,asp.net-mvc,entity-framework,asp.net-mvc-5,entity-framework-6,C#,Asp.net Mvc,Entity Framework,Asp.net Mvc 5,Entity Framework 6,我将遵循此处列出的教程: 使用我的VS2015企业IDE 但是,在步骤8中,我右键单击OrderController中的List ActionResult并选择Add View(添加视图),如下所示: 我得到以下错误: 但是在本教程中,他们没有为OrderVM使用密钥。即使我添加了[Key]和正确的使用方法,并且在重建之后,我仍然会得到相同的错误,我完全不知道为什么要使用getter和setter 视图模型: OrderVM 勤务主任 namespace WebAppTest.Models {
namespace WebAppTest.Models
{
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Data.Entity.Spatial;
[Table("OrderMaster")]
public partial class OrderMaster
{
[Key]
public int OrderID { get; set; }
public DateTime OrderDate { get; set; }
[Column(TypeName = "numeric")]
public decimal OrderAmount { get; set; }
[Required]
[StringLength(100)]
public string CustomerName { get; set; }
[StringLength(200)]
public string CustomerAddress { get; set; }
}
}
控制器
订单管理员
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using WebAppTest.Models;
using WebAppTest.ViewModels;
namespace WebAppTest.Controllers
{
public class OrderController : Controller
{
// GET: Order
//public ActionResult Index()
//{
// return View();
//}
public ActionResult List()
{
List<OrderVM> allOrder = new List<OrderVM>();
// here MyDatabaseEntities is our data context
using (MyModel dc = new MyModel())
{
var o = dc.OrderMasters.OrderByDescending(a => a.OrderID);
foreach (var i in o)
{
var od = dc.OrderDetails.Where(a => a.OrderID.Equals(i.OrderID)).ToList();
allOrder.Add(new OrderVM { order = i, orderDetails = od });
}
}
return View(allOrder);
}
}
}
以下是架子工检查关键字段的逻辑: 首先查找具有以下条件的所有属性: 属性应该是基元类型,如果不是基元类型,则可以是以下类型之一:字符串、十进制、Guid、DateTime、DateTimeOffset、TimeSpan。 然后尝试根据名称查找密钥: [Id]属性不区分大小写 [ClassName][Id]属性不区分大小写 尝试根据属性查找密钥: 具有键属性的属性 具有EdmScalarProperty属性且值为EntityKeyProperty=true的属性 具有值为IsPrimaryKey=true的列属性的属性 所以你应该在你的班上有一个符合上述标准之一的文件。 您还应该从order属性中删除[Key],因为复杂类型不能是Key 作为一个选项,您可以将此属性添加到类中:
[Key]
public int OrderID { get; set; }
作为另一个选项,OrderVM类可以如下所示:
public partial class OrderVM
{
public OrderVM()
{
orderDetails = new List<OrderDetails>();
}
[Key]
public int OrderID { get; set; }
public DateTime OrderDate { get; set; }
public decimal OrderAmount { get; set; }
[Required]
[StringLength(100)]
public string CustomerName { get; set; }
[StringLength(200)]
public string CustomerAddress { get; set; }
public List<OrderDetail> orderDetails { get; set; }
}
我刚刚遇到了这个问题。我尝试添加[Key],我使用了公共字符串Id{get;set;}。最终的解决办法是我只需要重建我的项目。我想把这个答案留在这里,以防将来有人遇到这个问题 OrderVM是一个视图模型,而不是数据模型-您不应该定义数据上下文类。您不能将复杂对象OrderMaster用作键感谢您的精心解释,如果可以的话,我会给出更多的要点:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using WebAppTest.Models;
using WebAppTest.ViewModels;
namespace WebAppTest.Controllers
{
public class OrderController : Controller
{
// GET: Order
//public ActionResult Index()
//{
// return View();
//}
public ActionResult List()
{
List<OrderVM> allOrder = new List<OrderVM>();
// here MyDatabaseEntities is our data context
using (MyModel dc = new MyModel())
{
var o = dc.OrderMasters.OrderByDescending(a => a.OrderID);
foreach (var i in o)
{
var od = dc.OrderDetails.Where(a => a.OrderID.Equals(i.OrderID)).ToList();
allOrder.Add(new OrderVM { order = i, orderDetails = od });
}
}
return View(allOrder);
}
}
}
[Key]
public int OrderID { get; set; }
public partial class OrderVM
{
public OrderVM()
{
orderDetails = new List<OrderDetails>();
}
[Key]
public int OrderID { get; set; }
public DateTime OrderDate { get; set; }
public decimal OrderAmount { get; set; }
[Required]
[StringLength(100)]
public string CustomerName { get; set; }
[StringLength(200)]
public string CustomerAddress { get; set; }
public List<OrderDetail> orderDetails { get; set; }
}