如何正确地使用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方法。内容如下:
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掌握得比较好的朋友能给予释疑解惑。
如何正确地使用Entity Framework Database First的更多相关文章
- mvc+entity framework database first,生成的model每次更新一个表会更新所有的model
在使用Entity Framework 的Database frist或model first时,直接加attribute到modle类上是太现实也不合理的,因为model类是自动生成的,重新生成后会 ...
- Entity Framework — ( Database First )
什么是Entity Framework Entity Framework是微软以 ADO.NET 为基础所发展出来的对象关系对应 (O/R Mapping) 解决方案.将数据存储从域对象自动映射到关系 ...
- asp.net mvc5 step by step(三)—— Entity Framework Database First
一.先建数据库. 打开,SQL Server Management 新建数据库Employee 并新建表 /****** Object: Table [dbo].[t_Employee] Script ...
- Entity Framework 之Database first(数据库优先)&Model First(模型优先)
一.什么是Entity Framework 1.1 实体框架(EF)是一个对象关系映射器,使.NET开发人员使用特定于域的对象与关系数据.它消除了需要开发人员通常需要编写的大部分数据访问代码.简化了原 ...
- C# ORM—Entity Framework 之Database first(数据库优先)&Model First(模型优先)(一)
一.什么是Entity Framework 1.1 实体框架(EF)是一个对象关系映射器,使.NET开发人员使用特定于域的对象与关系数据.它消除了需要开发人员通常需要编写的大部分数据访问代码.简化了原 ...
- ADO.NET Entity Framework CodeFirst 如何输出日志(EF 5.0)
ADO.NET Entity Framework CodeFirst 如何输出日志(EF4.3) 用的EFProviderWrappers ,这个组件好久没有更新了,对于SQL执行日志的解决方案的需求 ...
- Solve: Your project references the latest version of Entity Framework (for MySQL) in Visual Studio 2013
The error message while trying to create a ADO.net Entity Data Model ( Entity Framework 6 ) for MySq ...
- [转]Entity Framework and slow bulk INSERTs
本文转自:https://weblog.west-wind.com/posts/2013/Dec/22/Entity-Framework-and-slow-bulk-INSERTs I’ve been ...
- .NET Core开发日志——Entity Framework与PostgreSQL
Entity Framework在.NET Core中被命名为Entity Framework Core.虽然一般会用于对SQL Server数据库进行数据操作,但其实它还支持其它数据库,这里就以Po ...
随机推荐
- Genesis 2.8-2.12
And the LORD God planted a garden eastward in Eden; and there he put the man whom he had formed. 9 A ...
- 对访问修饰关键字public, protected, internal and private的说明
对访问修饰关键字public, protected, internal and private的说明1.msdn: Internal types or members are accessible o ...
- ftp虚拟账号登陆
配置使用虚拟用户登录的FTP服务器,可以避免使用操作系统帐号作为FTP用户带来的一些安全问题,也便于通过数据库或其它程序来进行管理.废话不多说,这里记录下ftp虚拟账号登陆的部署过程及其中遇到的问题: ...
- iOS原生地图开发进阶——使用导航和附近兴趣点检索
iOS原生地图开发进阶——使用导航和附近兴趣点检索 iOS中的mapKit框架对国际化的支持非常出色.在前些篇博客中,对这个地图框架的基础用法和标注与覆盖物的添加进行了详细的介绍,这篇博客将介绍两个更 ...
- 026医疗项目-模块二:药品目录的导入导出-导入功能的Service的编写
这个导入功能要实现的效果是: 思路是: 因为我们最后是在Action层中调用的HxlsRead工具,这个工具传入的就是我们要实现的上一篇文章说到的实现了HxlsOptRowsInterface接口的类 ...
- 你会在C#的类库中添加web service引用吗?
本文并不是什么高深的文章,只是VS2008应用中的一小部分,但小部分你不一定会,要不你试试: 本人对于分布式开发应用的并不多,这次正好有一个项目要应用web service,我的开发环境是vs2008 ...
- C语言 动态库简单开发
动态库项目 //简单的动态库开发----报文发送 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib. ...
- Android -- Scroller
Android里Scroller类是为了实现View平滑滚动的一个Helper类.通常在自定义的View时使用,在View中定义一个私有成员mScroller = new Scroller(conte ...
- Ubuntu 14.04 下安装google的浏览器——Chrome
小编用过好多浏览器,但最后还是选择Chrome, 因为这款浏览器确实做的不错,可是Ubuntu下自带的是火狐,因此小编在这里和大家分享一下如何在Ubuntu下安装chrome浏览器 工具/原料 安 ...
- 说说C#中IList与List区别
首先IList 泛型接口是 ICollection 泛型接口的子代,并且是所有泛型列表的基接口. 它仅仅是所有泛型类型的接口,并没有太多方法可以方便实用,如果仅仅是作为集合数据的承载体,确实,ILis ...