新接触ASP.NET MVC5(这个说法准确?),采用vs2015,发现困难好多,以前只接触过HTML、ASP。

现在准备用MVC5做个小系统,发现了多个问题,本文说明数据库的问题之一:

EntityType“TbFun”未定义键。请为该 EntityType 定义键

我有一张表:

TbFun,只有两个字段,定义如下:

CREATE TABLE [dbo].[TbFuns] ([FunId]   INT           IDENTITY (0, 1) NOT NULL,[FunName] NVARCHAR (50) NOT NULL,CONSTRAINT [PK_dbo.TbFuns] PRIMARY KEY CLUSTERED ([FunId] ASC)
);

其中的FunId为整数主键,自动增长

定义它的模型:

    public class TbFun{public int FunId { get; set; }public string FunName { get; set; }}

定义数据库操作模型:

    public class fwDatabase : DbContext{public fwDatabase() : base("fwDB"){}public DbSet<TbFun> TbFuns { get; set; }... // 这是其它的表}

连接字符串为 fwDB。
在一个Controller中,我要加载数据:

public class FileController : Controller
{private fwDatabase m_db = new fwDatabase();int m_funIndex;string m_strFunName = "";public ActionResult Index(){var defFunInfo = m_db.TbFuns.Single(tb => tb.FunId == 1);m_funIndex = defFunInfo.FunId;m_strFunName = defFunInfo.FunName;return View();}... // 其它动作
}

在这个 Index()  中,第一行从这个表中搜索一条记录出来(这条记录是我自己通过表加进去的,它一定存在),结果总是提示标题中的错误:

EntityType“TbFun”未定义键。请为该 EntityType 定义键

这就奇怪了,我看了很多遍,度娘了好多次,大家的一致说法就是在前面加上 [Key] ,如下:

    public class TbFun{[Key]public int FunId { get; set; }public string FunName { get; set; }}

但是所有人都没有说明是为啥。

我重新建立一个工程,选项和当前的项目一样,建立完之后,参考:

https://www.cnblogs.com/sanshi/p/6210695.html

中的“数据库操作”一节,在完成后,检查Students的模型定义,它前面它的 ID 前是没有 [Key] 关键字的,表的定义,除了字段数量和字段名称不一样,主键的属性也都完全一样,但它是可以正常运行的,我也通过页面添加了一条记录进去,而且也可以通过页面显示出来,这就更奇怪了。

通过反复对比,终于发现一个了一个区别,就是Students表的主键字段名称为 ID,而我的表的主键字段名称为 FunId,难道是这个不一样导致的?

我把Students的模型以及相关代码中的 ID,改成了 StuId(这和我表中的主键字段名称形式上也一样了),然后再调试。这次到了

return View(m_db.Students.ToList());

这一行时,果然出现了标题中的错误提示!

“System.Data.Entity.ModelConfiguration.ModelValidationException”类型的异常在 EntityFramework.dll 中发生,但未在用户代码中进行处理其他信息: 模型生成过程中检测到一个或多个验证错误:TestData.Models.Student: : EntityType“Student”未定义键。请为该 EntityType 定义键。Students: EntityType: EntitySet“Students”基于未定义任何键的类型“Student”。

再看看ie页面上的显示:


“/”应用程序中的服务器错误。模型生成过程中检测到一个或多个验证错误:TestData.Models.Student: : EntityType“Student”未定义键。请为该 EntityType 定义键。
Students: EntityType: EntitySet“Students”基于未定义任何键的类型“Student”。说明: 执行当前 Web 请求期间,出现未经处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 异常详细信息: System.Data.Entity.ModelConfiguration.ModelValidationException: 模型生成过程中检测到一个或多个验证错误:TestData.Models.Student: : EntityType“Student”未定义键。请为该 EntityType 定义键。
Students: EntityType: EntitySet“Students”基于未定义任何键的类型“Student”。源错误: 行 18:         public ActionResult Index()
行 19:         {
行 20:             return View(m_db.Students.ToList());
行 21:         }
行 22: 源文件:  Q:\exp\asp.net\TestData\TestData\Controllers\StudentsController.cs    行:  20

这个错误不多贴一次心里不爽,困了我好久,现在终于复现了它!

这样,大概明白了是怎么回事。

对于MVC,它并不知道表模型中的哪个字段是主键,但是它又要求必需有一个主键,所以,要么这个主键字段名称必需为 ID,要么就指定哪个字段是主键。现在既然我的表中没有名称为 ID 的这个字段,所以就必需把另外一个整形字段 FunId 指定为主键

    public class TbFun{[Key]public int FunId { get; set; }public string FunName { get; set; }}

好了,像上面这样,添加 [Key] 之后,这个问题解决!

不过还是有一点疑问:学习的站点 mvcmusicstore 的表模型定义中,其主键字段的名称不是 ID,但是在模型定义中,也没有 [Key] 关键字,它为啥就能正常工作(下载的代码我没有尝试运行,所以我不确定在我这里是否可以正常运行,它也许是vs2013的工程---因为我用vs2015打开时,提示工程版本将升级,可能是vs2013的工程中不需要这个 [Key] 关键字吧)?

MVC5中的错误:EntityType“TbFun”未定义键。请为该 EntityType 定义键相关推荐

  1. 《R语言初学指南》一2.3 找到R脚本中的错误

    本节书摘来自异步社区<R语言初学指南>一书中的第2章,第2.3节,作者[美]Brian Dennis(布莱恩·丹尼斯),更多章节内容可以访问云栖社区"异步社区"公众号查 ...

  2. SAP错误提示:“未在成本控制范围中给会计年度*定义版本*”

    前期在财务应用中遇到过如下提示,"Versin 0 is not defined for fiscal year 2020".进入到帮助信息中给出了更详细的信息:"The ...

  3. c语言中错误为ffblk未定义,C语言中头文件及函数的含意的总分类

    ALLOC.H 说明内存管理函数(分配.释放等). ASSERT.H 定义assert调试宏. BIOS.H 说明调用IBM-PC ROM BIOS子程序的各个函数. CONIO.H 说明调用DOS控 ...

  4. oracle11g 数据库导出报“ EXP-00003: 未找到段 (0,0) 的存储定义”错误的解决方案

    原文链接:http://edmzkj.blog.51cto.com/9115753/1433814 导出oracle11.2.0.2的服务器的数据时,报"EXP-00003: 未找到段 (0 ...

  5. oracle 存进去0的数据库,oracle11g 数据库导出报“ EXP-00003: 未找到段 (0,0) 的存储定义”错误的解决方案...

    导出oracle11.2.0.2的服务器的数据时,报"EXP-00003: 未找到段 (0,0) 的存储定义"错误.初步分析是由于数据表是空表导致该问题. Oracle 11G在用 ...

  6. Python程序的错误:变量未定义(NameError: name ‘mesage’ is not defined.)

    Python程序的错误种类 Python程序的错误分两种.一种是语法错误(syntax error).这种错误是语句的书写不符合Python语言的语法规定.第二种是逻辑错误(logic error). ...

  7. main方法_错误: 在类 ZiFUChuan.Pyramid 中找不到 main 方法, 请将 main 方法定义为:

    错误: 在类 ZiFUChuan.Pyramid 中找不到 main 方法, 请将 main 方法定义为: public static void main(String[] args) 否则 Java ...

  8. “Matlab R2016a中运行‘mex -setup’,错误使用 mex 未找到支持的编译器或 SDK”的解决办法

    目录 问题描述: 原因分析: 解决方案: 1.失败经验 2.成功方法 (1)下载MinGW-w64 C/C++ 编译器 (2)安装MinGW-w64 C/C++ 编译器 (3)设置为系统环境变量 (4 ...

  9. 错误: 在类中找不到 main 方法, 请将 main 方法定义为:public static void main(String[] args)否则 JavaFX 应用程序类必须扩展javafx.ap

    最近在使用eclipse编写java程序时遇到这样一个问题: 错误在类中找不到main方法,请将main方法定义为 public static void main(String[] args)否则 J ...

最新文章

  1. 给树莓派增加微型摄像头 Raspberry Mode4
  2. 零基础快速入门SpringBoot2.0教程 (二)
  3. VS2010 C++下编译调试MongoDB“.NET研究”源码
  4. 数据结构与算法-索引1909
  5. devc++不兼容_Mac压缩文件Win不支持?BetterZip帮你解决!
  6. 判断回文(Java和JavaScript)
  7. 架构师的第一步:学习两种抽象视角(Abstraction View)
  8. 虚拟机与宿主机以外的局域网中的其它主机ping不通
  9. 通过android手机内置GPS获取平面直角坐标和高斯坐标的原理(附代码)
  10. 360浏览器显示没网络连接服务器,360浏览器无法连接网络?怎么办?
  11. 系统学习语义分割文章推荐以及顺序
  12. Win11 的这 19 个新功能,你都用上了吗?
  13. 听歌识曲java_Android自定义View之继承扩展(仿网易云音乐听歌识曲)
  14. 竞逐新能源汽车续航,背靠广汽的巨湾技研能否打好“技术牌”?
  15. 关于龙芯CPU几发射的问题
  16. 分享一个简易的AT变速箱(TCU)换挡逻辑控制模型
  17. 李峋同款爱心代码 python版
  18. php 转换成string,在PHP中将数字(1,2,3)转换为string(一,二,三)
  19. MySQL的备份、恢复
  20. 京峰网站架构,上线流程

热门文章

  1. emq的客户端与服务端_EMQ ---客户端上线自动订阅主题
  2. php js 比较大小写,jquery与js字母大小写转换与首字母大写
  3. 算法设计练习题(1)——分治法
  4. 2019 微信小程序面试题
  5. javascript操作Long类型数据
  6. OpenCV探索之路(二十六):如何去除票据上的印章(C++ )
  7. 【视觉SLAM】Visual-Based Semantic SLAM with Landmarks for Large-Scale Outdoor Environment
  8. [转载]Python SMTP发送邮件-smtplib模块
  9. 红米Note4X 刷机LineageOs 14.1全过程讲解
  10. RN FlatList使用详解及源码解析