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

发表于:2016-1-26 10:54

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:井传红    来源:51Testing软件测试网采编

分享:
  提示表名无效
  有时候新加了一个实体类,数据库也相应加了一个表。然后理所当然的运行增加数据,结果就出现这提示
  排查过程
  然后又是一阵排查,再次确认了数据库中确实存在表,还手动存进去了一条数据。再跑到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 就是员工类的外键
32/3<123>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号