如何正确地使用Entity Framework Database First

毕设依旧在不紧不慢地以每天解决一个问题的进度进行中。今天遇到的问题就是在建立数据模型时遇到的。因为项目是基于数据库构建的,所以理所应当地采用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方法。内容如下:

这里可以看到抛出了一个异常。而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掌握得比较好的朋友能给予释疑解惑。

Original: https://www.cnblogs.com/ryuasuka/p/3598485.html
Author: 飞鸟_Asuka
Title: 如何正确地使用Entity Framework Database First

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/610676/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • k8s/kubeadm 生产环境高可用集群部署

    kubeadm 生产环境集群部署 基本环境配置 kubeadm 安装方式自 1.14 版本以后,安装方法几乎没有任何变化,此文档可以尝试安装最新的 k8s 集群, centos 采…

    Linux 2023年6月14日
    099
  • Java基础系列–06_抽象类与接口概述

    抽象类与接口的简单概述 抽象类(1)如果多个类中存在相同的方法声明,而方法体不一样,我们就可以只提取方法声明。如果一个方法只有方法声明,没有方法体,那么这个方法必须用抽象修饰。而一…

    Linux 2023年6月7日
    092
  • 大厂们的 redis 集群方案

    redis 集群方案主要有两类,一是使用类 codis 的架构,按组划分,实例之间互相独立;另一套是基于官方的 redis cluster 的方案;下面分别聊聊这两种方案; 类 c…

    Linux 2023年5月28日
    096
  • 分布式锁

    非分布式下使用锁 利用版本号来检测数据是否发生变化,从而判断是否能进行更新 JAVA 使用比较交换机制-CAS(Compare And Swap)机制实现 i++非线程安全,使用原…

    Linux 2023年6月7日
    097
  • Vue项目配置CDN

    两篇博客的实现方法不同。 另外:nginx的前端文件路径应该为:/usr/local/nginx/html下。 index.html <head> <meta c…

    Linux 2023年6月7日
    0102
  • 快速部署LAMP黄金架构,搭建disuz论坛

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Linux 2023年6月7日
    063
  • 重磅!微信官方恢复了个人红包封面的制作入口,限时开放!!.md

    前两天微信开放了个人红包封面,引起了大家欢呼雀跃~ 可惜……没几个小时,因为一个不可描述的原因,官方小程序下架了…… 但是, 现在好…

    Linux 2023年6月15日
    0165
  • JPA作持久层操作

    JPA(Hibernate是jpa的实现) jpa是对实体类操作,从而通过封装好的接口直接设置数据库的表结构。虽然jpa可以直接通过编写java代码来操作数据库表结构,避免了sql…

    Linux 2023年6月7日
    0122
  • 【4】2022年6月

    6月15日 今早10点教师资格面试成绩出来了,幸好一次性通过。笔面都一次性通过,比我预想的顺利,谢谢各位考官的照顾。 我知道自己面试的时候既感冒又受伤,状态是不好的,发挥不了真实的…

    Linux 2023年6月13日
    079
  • Java基础封装类型的缓存

    Java笔试常见题型 类型 缓存范围 Byte -128-127 Short -128-127 Integer -128-127 Long -128-127 Character 0…

    Linux 2023年6月7日
    0113
  • 使用SpringBoot校验客户端传来的数据

    前端的数据校验都是辣鸡!后端天下第一! 如果想完美地贯彻原则, 理论上来说就应该让前端那边少传数据过来, 有些的东西能查的就自己查出来。 常用的数据校验like this: /**…

    Linux 2023年6月14日
    080
  • CentOS 文件管理

    一、目录管理 1.1、目录结构 1.2、切换目录 1.3、查看目录 1.4、创建目录 1.5、复制目录 1.6、剪切目录 1.7、删除目录 二、文件管理 2.1、查看文件 2.2、…

    Linux 2023年5月27日
    0169
  • [ Shell ] 通过 Shell 脚本导出 CDL 网表

    通过 si 导出电路网表,实际上在 Virtuoso 中通过菜单 File – Export – CDL 和 Calibre LVS 中 Export fr…

    Linux 2023年6月7日
    0165
  • 课间游戏志:斗荧光笔与扒撸咔嚓

    课间游戏志:斗荧光笔与扒撸咔嚓 写这篇博客,主要是想记录两个课间游戏,一个是我于小学四年级时发明的斗荧光笔,一个是初中时班上几个变态发明的扒撸咔嚓,自从这两个游戏被发明以后,我们班…

    Linux 2023年6月6日
    0105
  • linux安装Oracle11G

    1、Linux下以Oracle帐户进入Linux系统。 2、执行以下命令查看数据库监听器的状况: lsnrctl status 3、执行以下命令停止数据库监听器运行: lsnrct…

    Linux 2023年6月13日
    081
  • 内存错误和服务器内存RAS功能-DELL篇-1

    简介 内存子系统错误是现代计算系统中最常见的一些错误类型。了解内存错误是如何发生的以及如何预防或避免它们可能是一个复杂的话题–在过去30年里,这个话题挑战了无数的行业研…

    Linux 2023年6月7日
    0139
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球