配置使用EF常见的一些问题及解决方案

本文针对Entity Framework在使用过程中常见的几个问题进行了详细的分析与解答,包括驱动程序未注册、表名无效、数据库字段记录为null时EF操作报错以及如何正确使用外键等问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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>

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("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 DbSet<Employee>a_Emp { get; set; }

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

 

总结

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

转载于:https://www.cnblogs.com/csl0910/p/4949796.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值