前言

最近做了个winform小项目,为方便快速开发,后台框架使用了ef6.0+sqlserver2008架构,遇到各种问题,真是伤脑筋。现将遇到问题和解决方案写下来,方便查阅

提示未注册,找不到驱动程序

No Entity Framework provider found for the ADO.NET provider with invariant name 'System.Data.SqlClient'. Make sure the provider is registered in the 'entityFramework' section of the application config file.

这个问题比较坑,我根据上面的提示,跑到配置文件去查看,看有没有entutyFramework节点,是否注册驱动。结果按照网上的解决方案把配置文件贴上去了还是报错,然后再查看EntityFramework.SqlServer.dll是否已经引用到数据访问层类库中,也在。这下就懵逼了,到底是什么情况,网上各种搜,比如把EntityFramework.SqlServer.dll的赋值到本地属性设为True后还是没有用,折腾了个把小时,最后突然看了一眼bin\Debug目录,发现只有一个EntityFramework.dll文件,没有EntityFramework.SqlServer.dll,我就瞬间释然了,原来是这样。。。

解决方案:

1.检查是否引入EntityFramework.dll 和EntityFramework.SqlServer.dll

2.检查是否设为复制到本地属性为True

3.检查配置文件是否注册驱动

如我的是sqlserver数据库:

<providers>
<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
</providers>

如果是mysql

 <providers>
      <provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6, Version=6.8.3.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d"></provider>
    </providers>

将上面这段代码放到<entityFramework>节点下面就可以了,并且要引入几个dll

4.查看编译后的目录中是否有这2个dll,如果没有,手动拷贝进去

提示表名无效

有时候新加了一个实体类,数据库也相应加了一个表。然后理所当然的运行增加数据,结果就出现这提示

排查过程

然后又是一阵排查,再次确认了数据库中确实存在表,还手动存进去了一条数据。再跑到BaseContext:DbContext这个类里面一阵翻,确定已经有  public DbSet<Employee>a_Emp { get; set; }这个属性了。又跑到实体类中确认字段是否吻合,主键[key]标记是否已经标了。最后又对比了之前的项目2个实体之间的差别。最后终于发现。。。实体类没有和数据库关联

解决方案

1.确认数据库表是否存在

2.确认BaseContext:DbContext类中是否有属性

3.确认实体类中字段与主键

4.确认实体与数据库表是否关联

    [Table("a_Emp")]
    public class Employee

另:实体类上面的[table]小括号里面的就是数据库的表名,并且该标记需要引用dll

using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

数据库字段记录为null时 ef 操作数据库报错

错误排查

这个问题是数据库字段为空导致的,ef 反射赋值时实体时发生的错误,如:ToList()、

_db.Set<TEntity>().AddRange(entry);
_db.SaveChanges();

解决方案

2种任选一种

1.将数据库所有字段都赋值,不存在为空的情况 自然不会报错,但毕竟繁琐

2.将数据库中可空字段再实体中用可空类型表示

如:

public DataTime? CreateTime{get;set;}
public int? Num{get;set;}
public decimal? Pirce{get;set;}

目前我知道的就这2种,应该够用了

EF中的外键

外键是常用的数据关联形式,在数据访问中占据重要位置,下面来看看使用外键的几个步骤

一、将2个实体类都准备好,一个主键表一个外键表,例如 员工表中需要部门编号 那么就需要准备员工类和部门类

二、在员工实体类Employee中加入一个对象实体,加一个部门Id,没错,不是一个单纯的部门ID 而是实体

    [Key]
        public int EmpId { get; set; }
        /// <summary>
        /// 姓名
        /// </summary>
        public string EmpName { get; set; }
        /// <summary>
        /// 性别
        /// </summary>
        public string Sex { get; set; }
        /// <summary>
        /// 生日
        /// </summary>
        public DateTime BirthDay { get; set; }

        /// <summary>
        /// 部门
        /// </summary>
        public int DepId { get; set; }

        /// <summary>
        /// 关联主表
        /// </summary>
        [ForeignKey("DepId")] 

         public Dept Dept { get; set; } //注意:ForeignKey("DepId")中的DepId 就是员工类的外键

四、Dept部门表中必须有主键

五、调用的时候

 db.a_Emp.Include("Dept").Where(l => l.Dept.name.Contains(name)||string.IsNullOrEmpty(name)).ToList()

其中a_Emp是员工类的实体对象,在baseContext里面的 public DbSet<Employee>a_Emp { get; set; }

Dept.name是可以直接点出来的了

HttpContext.User.Identity.IsAuthenticated一直为false

使用mvc时会用到权限控制,并且存cookie,然后一般会出现下面的一段代码

 protected override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            var request = filterContext.HttpContext.Request;
            var response = filterContext.HttpContext.Response;

            currentUser = new AdminUser();
            if (filterContext.HttpContext.User.Identity.IsAuthenticated)
            {
                long.TryParse(System.Web.HttpContext.Current.User.Identity.Name, out userid);
                )
                {
                    currentUser = AdminUserDAL.getEntryById<AdminUser, long>(userid);
                    currentUser.allprivileges = AdminUserDAL.getUserPrivilegeAll(-, userid);
                    myPermissionList = currentUser.allprivileges;
                }
            }
            else //返回登录页
            {
                response.Redirect("/Acount/Login");
            }

一直为false的时候就会出现始终跳到登录页,就算调试也找不到为什么会这样

解决方案

在webconfig文件的system.web节点下面加入节点就行了

  <authentication mode="Forms">
      <forms loginUrl=" protection="All" path="/" requireSSL="false" slidingExpiration="false" enableCrossAppRedirects="false" cookieless="UseCookies" />
    </authentication>

里面的内容可以自己根据需要配置

总结

以上是我遇到的众多问题之一,限于篇幅和时间,暂时就记录到这里吧。如果有什么理解错误的地方,还望指正!!!

请关注我的博客地址:http://www.cnblogs.com/jingch 给个赞吧!

配置使用EF6.0常见的一些问题及解决方案的更多相关文章

  1. ASP.NET MVC4 数据库连接(EF6.0)

    我的博客原文地址:http://www.star110.com/Note/ReadArticle/60641215331146140041.html 环境:.NET MVC4 + EF6.0 连接数据 ...

  2. 配置httpd2.4与常见的I/O模型说明

    配置httpd2.4与常见的I/O模型说明 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.httpd2.4访问控制 1.基于IP访问控制: 允许所有主机访问:Require a ...

  3. EF6.0 对于数据库优 模式 新加功能

    EF6.0相对于5.0新加了很多功能.先看看两个模式的一些特点. 数据库优先(设计者)和代码优先两者的特点: 连接弹性 异步查询和保存 基于代码的配置 数据库命令记录 数据库命令截取 依赖决议 DbS ...

  4. Asp.Net MVC+BootStrap+EF6.0实现简单的用户角色权限管理

    这是本人第一次写,写的不好的地方还忘包含.写这个的主要原因是想通过这个来学习下EF的CodeFirst模式,本来也想用AngularJs来玩玩的,但是自己只会普通的绑定,对指令这些不是很熟悉,所以就基 ...

  5. 在VisualStadio2015上使用EF6.0建立MySql数据库

    1.新建工程 2.建立类的文件夹DAL 3.建立相关类 [Student类] using System;using System.Collections.Generic;using System.Li ...

  6. EF6.0批量插入

    EF6.0批量插入有多种方式,可以使用EntityFramework.Extensions,提供的有BulkInsert. /// <summary> /// 批量插入 /// </ ...

  7. win10下vs2015配置Opencv3.1.0过程详解

    下载安装Opencv3.1.0 下载Opencv3.1.0,进入官网,点击opencv for windows即可下载.  点击运行下载好的文件.实际上,opencv的安装程序就是解压缩文件,个人因为 ...

  8. 在Windows 2008/2008 R2 上配置IIS 7.0/7.5 故障转移集群

    本文主要是从:http://support.microsoft.com/kb/970759/zh-cn,直接转载,稍作修改裁剪而来,其中红色粗体部分,是我特别要说明的 若要配置 IIS 7.0 和 7 ...

  9. MyEclipse 8.5配置Tomcat 7.0

    MyEclipse 8.5配置Tomcat 7.0 在窗口(Windows)->首选项(Prefrences)->MyEclipse->Servers->Tomcat 6.x下 ...

随机推荐

  1. IT求职中,笔试、面试的算法准备

    PS:此文章为转载,源地址:http://www.newsmth.net/nForum/#!article/CoderInterview/849     作者应该是在美国进行的笔试面试,感觉面试的的公 ...

  2. C语言模块化编译介绍

    C语言模块化编译介绍 模块化编程的概念 所谓模块化变成(多文件开发),就是多文件(.c文件)编程,一个.c文件和一个.h文件可以被称为一个模块. 头文件开发的注意事项: 1)头文件中可以和C程序一样引 ...

  3. iis里面浏览网页,提示找不到应用程序的解决办法

    iis配置成功,数据库链接正确,代码无误,在iis里面,浏览某网页,提示找不到应用程序,这时一下子懵了. 处理办法:在浏览器中直接输入网址,例如:http://192.168.1.111,这时能够打开 ...

  4. Centos 6.5 安装 ionCube PHP Loader

    使用某些php的程序的时候会出现提示:Site error: the file /***/index.php requires the ionCube PHP Loader ioncube_loade ...

  5. 商品sku规格选择效果,没有商品的不能选中,选择顺序不影响展示结果

    <!DOCTYPE HTML> <html lang="en-US"> <head> <meta charset="UTF-8& ...

  6. GDI+ 绘制经验

    现有一种场景,鼠标移动时,假设鼠标坐标为 X , Y , 需实时在 坐标 (X , 0) , (0 , Y) 两处更新内容. 方案一:增加两个label ,或其它控件,鼠标移动时,实时更新 label ...

  7. 《JavaScript高级程序设计》读书笔记--(3)引用类型

    ECMAScript从技术来说是一门面向对象的语言,但不具备传统的面向对象语言所支持的类和接口等基本结构.虽然引用类型与类看起来类似,但是他们并不是相同的概念.引用类型有时也被成为对象定义,因为它描述 ...

  8. js初学者的div移动

    <!DOCTYPE HTML> <html lang="en-US"> <head> <meta charset="UTF-8& ...

  9. MicroERP软件更新记录1.0

    版本号:1.0.256 本次: 1\修复了选择货位时的BUG; 2\增加了物品资料由EXCEL表批量导入的功能; 3\物品资料增加了三个自定义属性; 4\优化了科目汇总账(余额表)算法; 5\应大家建 ...

  10. Hibernate1

    计应134(实验班) 杨伟 Hibernate的核心接口一共有6个,分别为:Session.SessionFactory.Transaction.Query.Criteria和Configuratio ...