问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何正确地使用Entity Framework Database First

发布网友 发布时间:2023-11-09 22:21

我来回答

1个回答

热心网友 时间:2024-10-23 07:17

  转载 今天遇到的问题就是在建立数据模型时遇到的。因为项目是基于数据库构建的,所以理所应当地采用DB First来构造实体类和DbContext类。于是想也没想就直接在项目上右键->添加->新建项->ADO.NET 实体数据模型。然后一路“下一步”就把数据库的表映射成了实体类了。然后再按照以前的教程,建立IRepository接口定义数据库操作,并实现了其中的各个方法。看似一切顺利了,我就打算单元测试一下,可是没想到测试的运行抛出了异常。

  测试方法 OpenEcnu.Data.Tests.DbContextTest.GetUserDetailByUserIdTest 引发了异常:
  System.NotSupportedException: 不支持通过使用 Database First 或 Model First 创建的 DbContext 创建 DbModelBuilder 或写入 EDMX。只能从不是使用现有 DbCompiledModel 创建的 Code First DbContext 获取 EDMX。
  仔细查看生成的DataContext类,发现有一个OnModelCreating方法。内容如下:

  protected override void OnModelCreating(DbModelBuilder modelBuilder)
  {
  throw new UnintentionalCodeFirstException();
  }
  这里可以看到抛出了一个异常。而UnintentionalCodeFirstException类的定义见http://msdn.microsoft.com/zh-cn/library/system.data.entity.infrastructure.unintentionalcodefirstexception(v=vs.113).aspx,这里把其中的一个“注释”摘录如下:

  如果在 Code First 模式中使用通过使用为 Database First 和 Model First 提供的 T4 模板生成的代码,则这些代码可能无法正常运行。 若要将这些类用于 Code First,请使用特性或 DbModelBuilder API 添加其他配置,然后删除引发此异常的代码。
  看了半天,仍旧一头雾水。Entity Framework构建数据模型,按道理来说无论是Code First还是Database First,都只是数据模型建立的方法不同,而在DbContext的桥梁作用下,代码和DB的衔接应该是没有区别才对。但在这里似乎微软把Code First和DB First又区别对待了。还是说我的使用方式不对?虽然后来我解决了测试无法运行的问题,但是本质依旧不明不白。

  还是说说怎么解决测试无法运行的问题吧。几经搜索之后,还是在msdn上找到了这样一篇文章http://msdn.microsoft.com/zh-CN/data/jj593170,它提供了一个工具叫做Entity Framework Power Tools,可以在VS的扩展中安装,该工具是免费的。

  安装好这个工具后,在项目上单击右键,在弹出的菜单中可以看到增加了一个Entity Framework的菜单项,里面有一个Reverse Enginner Code First。单击它以后出现选择数据连接的窗口,建立好数据连接之后它会自动地生成所有数据表所映射的实体类和对应的映射类(放在Mapping文件夹中),并且还自动生成了DbContext类。用生成的这些类取代原来通过EF直接建立的实体类和Context,编译项目并运行测试,测试成功。

  总结:从本次问题所出现的情况来看,似乎DB First和Code First还是有区别的。至于具体区别在哪儿还有待研究。

  另外还发现一个现象:通过EF直接映射数据库,所生成的类是包装在edmx文件中的,并且没有Map类;而Power Tools生成的类是直接在项目的目录下以.cs文件的形式存在,同时还有对应的Map类。这个问题和EF的内部原理是否有关?

  写下这篇博客算是一个记录和备忘,也是希望各位对EF掌握得比较好的朋友能给予释疑解惑。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
热血江湖剑客怎么升级快些 三月份有哪些花开花 三月份有哪些花开花呢 三月什么花开的最旺盛呢 请问急性化脓性扁桃体炎期间可不可以食用巧克力? 扁桃体化脓吃什么消炎药 为什么扁桃体发炎或者化脓以后不能喝冷水或者吃辣的东西呢? 扁桃体化脓能吃冰淇淋吗 扁桃体化脓可以吃什么 炸酱面通常使用哪种面条? ...写一篇150词左右的英语短文。 Halloween(万圣节... 24-70 f2.8可以拍人么3 假如朋友的注销了还能看她的朋友圈吗? 我的手机连上无线网。显示有信号。并在连接里显示已连接。但是却... 手机显示已经连接wifi,但是却不能上网!求救1082 微信的要怎么修改?1220 什么是位面? 什么是位面8 小说里的界面和位面分别是什么意思19 离婚时未成年子女抚养权会怎么判1 父母离婚,孩子一个成年,一个未成年,会怎么判 父母离婚,两个孩子,一个成年一个未成年,成年孩子可否单独立户...1 怎么看微信用了多久 怎么查看自己的用了多久 支付宝财富v3会降级吗 支付宝财富v3是什么条件 兰博基尼AVENTADOR中文名叫什么11 求翻译跑车名,兰博基尼大四款的中文名,称呼。333 形容“声音小”的成语有哪些 白玉蜗牛的生活习性是什么?132 亲爱的小伙伴,谁知道高瀚宇在拍摄画报时穿的ASH帆布鞋是哪个款式呀_百... d如何祛痘?329 洗羽绒服放白醋还是红醋2 一个新手机号怎么注册277 怎么才能到俄罗斯读硕士15 怎样用手机申请886 关于蜜蜂的知识有哪些?5104 为什么有的电脑网速很好就是短线,经常断线。4 手机丢失了,能用以前找到手机的位置吗? 魔兽世界同一账号下的其他角色都登陆正常,就是有一个角色一登就... 在家了用篮球怎么练习左手? 一个号码注册了两个 怎么找回第一个? 前二个月做的鼻甲肥大的手术,是用的等离子消融术做的,现在鼻涕...5 到俄罗斯读公费研究生有什么条件1 怎样用手机号注册291 我的迅雷下载东西怎么只有20多K 《你为谁读书》好句好段落18 《你在为谁读书》读书笔记46 迅雷下载速度很慢!!!怎么回事?? 怎么看一个用了多少年 怎么看自己的注册多久了15 仿快手仿抖音,与抖音和快手类似的APP怎么开发?需要多久?花多少钱可以...