原文地址:http://www.cnblogs.com/frankofgdc/p/3600090.html

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的时候需要注意,如果有需要,可以事先转换好。

暂时记下的问题就是这些,以后发现新的问题再补充。

Entity Framework学习笔记的更多相关文章

  1. Entity Framework 学习笔记(2)

    上期回顾:Entity Framework 学习笔记(1) Entity Framework最主要的东西,就是自己创建的.继承于DbContext的类: /// <summary> /// ...

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

    之前的小项目做完了,到了总结经验和更新学习笔记的时间了.开始正题之前先啰嗦一下,对之前的学习目标进行一个调整:“根据代码生成表”与“生成数据库脚本和变更脚本”合并为“Code First模式日常使用篇 ...

  3. Entity Framework学习笔记——记一个错误解决方式及思路

    继续之前设定的学习目标前,先来一篇小小的外篇.按照第一篇里的配置方式配置好的工程前两天还能正常工作,昨天却突然无法通过Add-Migration命令进行数据库的升级.错误信息如下: System.Da ...

  4. Entity Framework学习笔记——配置EF

    初次使用Entity Framework(以下简称EF),为了避免很快忘记,决定开日志记录学习过程和遇到的问题.因为项目比较小,只会用到EF的一些基本功能,因此先在此处制定一个学习目标:1. 配置EF ...

  5. Entity Framework学习笔记(四)----Linq查询(1)

    请注明转载地址:http://www.cnblogs.com/arhat 从本章开始,老魏就介绍一下Entity Framework使用Linq来查询数据,也就是Linq To Entity.其实在E ...

  6. Entity Framework学习笔记(三)----CRUD(2)

    请注明转载地址:http://www.cnblogs.com/arhat 昨天晚上老魏配的机器终于到了,可是拿回来之后什么都组装好了,唯独差一个非常重要的组件"电源线",老魏那个汗 ...

  7. Entity Framework学习笔记(二)----CRUD(1)

    请注明转载地址:http://www.cnblogs.com/arhat 这篇文章老魏和大家分享一下Entity Framework的CRUD操作,在这之前呢,老魏先说一下老魏对EF的一个整体的认识, ...

  8. Entity Framework学习笔记(一)

    请注明转载地址:http://www.cnblogs.com/arhat 哈哈!老魏回来了,4月份的内容开始更新了,由于3月份时间都在做项目,没有时间写了,那么4月份老魏会尽可能的多写点东西的.那么4 ...

  9. Entity Framework学习笔记(五)----Linq查询(2)---贪婪加载

    请注明转载地址:http://www.cnblogs.com/arhat 在上一章中,我们使用了Linq对Entity Framework进行了一个查询,但是通过学习我们却发现了懒加载给我来的性能上的 ...

随机推荐

  1. 【转】Inode详解

    Inode详解 转自: Inode详解   一.inode是什么 理解inode,要从文件储存说起. 文件储存在硬盘上,硬盘的最小存储单位叫做"扇区"(Sector).每个扇区储存 ...

  2. Atitit wsdl的原理attilax总结

    Atitit wsdl的原理attilax总结 1.1. 在 W3C 的 WSDL 发展史1 1.2. 获取wsdl,可能需要url后面加wsdl,也可能直接url1 1.3. Wsdl的作用2 1. ...

  3. EventBus3.0源码解析

    本文主要介绍EventBus3.0的源码 EventBus是一个Android事件发布/订阅框架,通过解耦发布者和订阅者简化 Android 事件传递. EventBus使用简单,并将事件发布和订阅充 ...

  4. 关于for、foreach、filter等的一些用法

    通常我们使用得最熟悉的是for循环. 比如对于一组数字的排大小,可以使用冒泡法. var a=[];     for(var d=0;d<5;d++){         var b=window ...

  5. LogNet4日志框架使用

    .百度一下log4dll下载 .webconfig 里的<configSetions>节点中添加 <section name="log4net" type=&qu ...

  6. [转]全面理解Unity加载和内存管理

    [转]全面理解Unity加载和内存管理 最近一直在和这些内容纠缠,把心得和大家共享一下: Unity里有两种动态加载机制:一是Resources.Load,一是通过AssetBundle,其实两者本质 ...

  7. Web安全测试之跨站请求伪造(CSRF)篇

    跨站请求伪造(即CSRF)被Web安全界称为诸多漏洞中“沉睡的巨人”,其威胁程度由此“美誉”便可见一斑.本文将简单介绍该漏洞,并详细说明造成这种漏洞的原因所在,以及针对该漏洞的黑盒测试与灰盒子测试具体 ...

  8. BST、B树、B+树、B*树

    一. BST BST即二叉搜索树Binary Search Tree(又叫二叉排序树Binary Sort Tree).它有以下特点: 所有非叶子结点至多拥有两个儿子(Left和Right): 所有结 ...

  9. 打造属于自己的vim利器

    毋庸置疑vim很强大,然而没有插件的话对于大多数人来说他的界面是很不友好的.下面简单写一下我对vim的配置 这是我的vim配置,装的插件不是很多,对我来说已经够用.左边的侧边栏是NERD插件提供的,还 ...

  10. Solaris的vi

    进入输入模式i: 在光标之前插入a: 在光标之后插入o: 在下面新建一行输入I: 光标移动到本行首插入A: 光标移动到本行末尾插入O: 在上面新建一行输入 移动光标M:移到屏幕中间一行的行首L:移到屏 ...