Entity Framework学习笔记——错误汇总

以前的小项目作完了,到了总结经验和更新学习笔记的时间了。开始正题以前先啰嗦一下,对以前的学习目标进行一个调整:“根据代码生成表”与“生成数据库脚本和变动脚本”合并为“Code First模式平常使用篇”,增长如今这篇“错误汇总”,增长“Code First模式与其余模式混合使用与Fluent API篇”,“生成视图”由于此次在项目中没有使用,最后研究后再写出来。
经过项目实战,以为EF并不像以前想象中的这么容易上手。问题不是EF设计的很差,EF使用起来其实至关便捷,多数数据库操做一两行代码就能搞定,基本不须要本身写SQL。问题主要有两点:EF的学习资源基本局限在官方网站,由于EF更新相对比较快,各类书籍资料更不上很正常;再就是EF初学者很容易遇到问题,各类问题……这篇文章的主要目的就是跟你们分享项目的整个过程当中遇到的问题。
此次项目中遇到的问题主要能够分为如下几类:
1. 配置文件问题
2. Visual Studio编译和程序集问题
3. 数据库问题
4. 代码问题(导航属性外键关联,linq中的Convert)
其中第4点,代码问题可能的状况很是多,只说一下我遇到的一两个问题。

1. 配置文件问题
配置文件的问题在 第二篇学习笔记中提到了,这里只作简单的总结。
配置文件涉及的问题可能有以下一些状况:
    1. 数据库链接字符串配错了,常见的有数据库服务器名称、数据库名拼写错误。
    2. 数据库链接字符串里的用户名密码没有登陆权限或者密码过时了了。
    3. 数据库链接字符串配置项的name值与Context的名称不一致找不到。
    4. EF会使用VS中设置的启动项目的配置文件(Web.config或App.config)工做,而启动项目中恰好没有正确配置EF

2. Visual Studio编译和程序集问题
在项目开发过程当中有一次用svn客户端的清理功能把全部忽略的文件清理掉了,包括编译生成的obj和Bin文件夹。再次编译时发现WCF端方法报错:

没法为具备固定名称“System.Data.SqlClient”的 ADO.NET 提供程序加载在应用程序配置文件中注册的实体框架提供程序类型“System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer”。请确保使用限定程序集的名称且该程序集对运行的应用程序可用。有关详细信息,请参阅 http://go.microsoft.com/fwlink/?LinkId=260882。

通过查找,发现是WCF项目的Bin文件夹下缺乏EntityFramework.SqlServer.dll这个程序集致使的。多是本身EF使用有问题,也多是EF的一个bug。我在Db层引用了这个程序集,而后在WCF项目中引用了Db项目,最后Db引用的程序集却没有拷贝到WCF中。

3. 数据库问题
数据库可能出的问题也挺多,若是项目的数据库不是项目独占,而是共用的,有些表多是共享的。好比此次作的这个项目,由于是一个工具性质的项目,依赖另外一个正在开发的系统的几张表。其实这种用法就会有不少问题,首先这是一种后面要介绍到的Code First和Database First两种模式的混合模式。其次两个系统之间的耦合度十分高,对方系统表若是有必定的变动就会影响到系统,当时为了节省接口开发的工做量就直接采用数据库访问了。
说了这么多,第一个可能遇到的问题就是数据库结构发生了变化,跟代码里的实体不一致了,好比表名或字段名发生了变化。

另外一个问题是数据库的帐号权限有问题,开发的时候不少人可能会使用sa帐号登陆数据库,开发的时候一点问题也没有,但是到部署的时候,就可能出现这样那样的问题。昨天客户在部署系统,告诉我部署出问题部署不了,远程看了下,发现了两个问题,其中一个问题就是数据库帐号权限的问题。客户建的帐号里只有一个public权限,没有DataReader和DataWriter,这确定是不行的。由于客户坚持另外一个系统也用的这个帐号,能正常访问。我将信将疑亲自试了一把,没有DataReader和DataWriter的状况下,帐号连到SSMS里一张表也看不见,查询直接报错,找不到对象,加上DataReader就立马能查询了,但是插入、更新和删除都不行,加上DataWriter后正常。

开发过程当中还遇到过另外一个系统的负责人将Code First迁移用到的__MigrationHistory表删掉了,致使没法新增迁移的状况。这个表删掉了,系统仍是能正常工做的,只是更新数据库和新增迁移时会很麻烦,我是将我本身的表全删掉,从新更新数据库,而后才能新增迁移的。这样测试数据就全丢失了,好在不重要。后来通过查询资料,得知EF6开始,能够自定义__MigrationHistory的名称了,有兴趣能够看msdn上的 这篇文章

另外还据说数据库版本是2000使用EF会有问题,也有说2005也可能有问题的,此次没有验证过,由于开发时候用的是SQL Server 2008r2。

4. 代码问题
刚使用EF的时候对导航属性并无太多概念,在导航属性上没有加virtual关键字,在使用过程当中发现导航属性都没有加载出来。原来不加virtual关键字就不会启用延迟加载特性,不过能够手动使用积极加载(Eagerly Loading)的方式让EF加载导航属性,并且是非延迟的。只须要使用DbQuery<TResult>的Include方法便可。这一点有时可能须要用到。有兴趣能够参考msdn上的 这篇文章。 另外一个问题则是在使用EF时,觉得EF能够像之前使用的linq表达式同样随意写,在有些条件判断的地方用到了System.Convert下的函数,结果在运行时就报错了。由于EF是要把linq表达式转换为sql语句的,而System.Convert和其余一些函数是不支持转换为sql语句的,所以在使用ef的时候须要注意,若是有须要,能够事先转换好。 暂时记下的问题就是这些,之后发现新的问题再补充。
相关文章
相关标签/搜索