2016-05-03 81 views
0

所以我一直在关注ASP.NET上的这个教程。我创建了一个模型,并打算使用实体框架生成具有视图的控制器。然而,我一直在这个错误上停留了近几个小时,研究原因及其唯一的两行代码,而且我不能理解我如何得到这个错误。EntityType''没有定义密钥

链接教程https://mva.microsoft.com/en-US/training-courses/introduction-to-asp-net-mvc-8322?l=Omf358Zy_1604984382 This is all the code I have written Receiving this message

+0

将[Key]属性添加到您的主键。 – Zaki

+0

我已经尝试了在“TaskID”上面添加[Key]的选项,但是我没有链接数据库,但它没有解决问题 –

回答

0

这里,我们去:

你应该添加[KEY]属性为你的TaskID像这样的代码:

public class Tasks 
{ 
[Key] 
public int TaskID {get;set;} 
public string taskStatus {get;set;} 
} 

希望它有帮助;)

+0

啊,它第一次不工作的原因是因为我没有发布命名空​​间。谢谢! –

1

使用[Key]属性

考虑在这个类的主键设置[Key]属性:

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

该数据属性将让实体框架知道如何执行查询,更新等时正确认识到这一点,作为这个实体的标识符

使用内置的约定

实体框架通常可以自动识别它的领域,如this Code First Conventions article引用:

以前代码如果 该属性被称为Id<class name>Id,则首先会推断属性是主键。

到 这个约定的唯一变化是,一旦主键属性,如果 其类型为“诠释”,“长”或“短”,他们被登记为默认数据库 标识列检测。主键检测是 不区分大小写。

+0

它不区分大小写:它在您发布的报价中说得很对。它只是无法找到它,因为类名是复数。 – DrewJordan

0

在EntityFramework中,当您尝试设置主键时,可以使用数据注释或约定。如果您使用约定,则需要使用<className>IdId。否则,您需要在属性上方指定[Key]

1

实体框架需要一个主键,你可以通过

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

加入,或尝试将其重命名

public int TasksID { get; set; } 
0

[Key]应该工作,记得重建你的项目。如果您已经有了用于创建架构的迁移,那么您将不得不更改它们,或者添加一个新的架构。

我会建议将您的班级名称更改为Task而不是Tasks。你的课堂看起来像一个单一的项目,而不是项目列表。这将有助于在几个方面:

  1. EF会妥善拿起TaskID的ID(它看起来字段要么只标记ID或<classname>ID如果我没有记错)。您不必用[Key]注释强制它。
  2. 你DbSet现在可以称为Tasks,这应该是比较正确的:一组Task秒,而不是一组称为Tasks持有几个单独Tasks项目。我认为C#可以分辨出不同,但是您可以在不检查每个引用的情况下吗?
相关问题