提示未注册,找不到驱动程序
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.检查配置文件是否注册驱动
?
?
?
4.查看编译后的目录中是否有这2个dll,如果没有,手动拷贝进去
?
提示表名无效
?
有时候新加了一个实体类,
数据库也相应加了一个表。然后理所当然的运行增加数据,结果就出现这提示
排查过程
?
然后又是一阵排查,再次确认了数据库中确实存在表,还手动存进去了一条数据。再跑到BaseContext:DbContext这个类里面一阵 翻,确定已经有 ?public DbSeta_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().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; }
///
/// 姓名
///
public string EmpName { get; set; }
///
/// 性别
///
public string Sex { get; set; }
///
/// 生日
///
public DateTime BirthDay { get; set; }
///
/// 部门
///
public int DepId { get; set; }
///
/// 关联主表
///
[ForeignKey("EmpId")]
public Dept Dept { get; set; } //注意:ForeignKey("EmpId")中的EmpId 就是员工类的主键
四、Dept部门表中必须有主键
?
五、调用的时候
?
db.a_Emp.Include("Dept").Where(l => l.Dept.name.Contains(name)||string.IsNullOrEmpty(name)).ToList()
?
其中a_Emp是员工类的实体对象,在baseContext里面的 public DbSeta_Emp { get; set; }
?
Dept.name是可以直接点出来的了