以下小编整理的Entity Framework常见错误的汇总,大家如果还有不明白可以在下面留言区讨论。

1 实体属性配置为IsRequired()对更新的影响

抛出异常类型DbEntityValidationException

表结构:

实体:

public class User

{

public int Id { get; set; }

///

/// 账号

///

public string Account { get; set; }

///

/// 邮箱

///

public string Email { get; set; }

///

/// 昵称

///

public string Nickname { get; set; }

///

/// 头像

///

public string AvatarId { get; set; }

///

/// 记录插入时间

///

public DateTime InsertTime { get; set; }

///

/// 记录修改时间

///

public DateTime UpdateTime { get; set; }

}

实体配置:

modelBuilder.Entity().Property(u => u.Account)

.IsRequired()

.IsUnicode(false)

.HasMaxLength(50);

modelBuilder.Entity().Property(u => u.Email)

.IsRequired()

.IsUnicode(false)

.HasMaxLength(100);

modelBuilder.Entity().Property(u => u.Nickname)

.IsUnicode(false)

.HasMaxLength(50);

modelBuilder.Entity().Property(u => u.AvatarId)

.IsOptional()

.HasMaxLength(100);

CustomDbContext继承自DbContext

[DbConfigurationType(typeof(MySqlEFConfiguration))]

public class CustomDbContext : DbContext

{

public CustomDbContext()

: base("name=Master")

{

this.Configuration.LazyLoadingEnabled = false;

//DropCreateDatabaseIfModelChanges

//new DropCreateDatabaseAlways()

Database.SetInitializer(null);

}

public DbSet Users { get; set; }

protected override void OnModelCreating(DbModelBuilder modelBuilder)

{

base.OnModelCreating(modelBuilder);

EntityConfiguration.Set(modelBuilder);

}

}

更新操作:

using (CustomDbContext db = new CustomDbContext())

{

User user = new User

{

Id = 1,

Email = "test@1622.com",

};

DbEntityEntry entry = db.Entry(user);

entry.State = EntityState.Unchanged;

entry.Property(t => t.Email).IsModified = true;

int num = db.SaveChanges();

}

执行操作,报错信息如下:

查看EntityValidationErrors,

只能看到{System.Data.Entity.Validation.DbEntityValidationResult},没有更详细的信息。

如果将上述代码用try..catch包起来,如下写法:

try

{

//执行代码

}

catch (DbEntityValidationException ex)

{

var e = ex.EntityValidationErrors;

}

catch (Exception ex)

{

}

一层一层地打开,看到真正导致异常的原因,看到下面的截图:

分析实体配置发现,Account属性被设置为IsRequired,那么在更新实体的时候,即使不更新这个字段,也要给这个字段赋值,那么赋值后观察:

更新操作代码变为

using (CustomDbContext db = new CustomDbContext())

{

User user = new User

{

Id = 1,

Email = "test@1622.com",

Account = "a"

};

DbEntityEntry entry = db.Entry(user);

entry.State = EntityState.Unchanged;

entry.Property(t => t.Email).IsModified = true;

int num = db.SaveChanges();

}

经过上述调整后,更新成功。

那么换一个思路,将Account属性被设置为IsOptional()是不是也可以呢?

修改实体配置,将Account属性设置按如下修改,并注掉上面的Account = "a"

modelBuilder.Entity().Property(u => u.Account)

.IsOptional()

.IsUnicode(false)

.HasMaxLength(50);

执行测试,更改成功。

得出结论:在实体配置时,指定了为必选的字段,那么更新操作时,构造实例一定要对必选(IsRequired())字段赋值。

上述测试中还有一个值得考虑的细节,构造User实例的时候,只对Id,Email进行了赋值,而没有对其他属性进行赋值,那么为什么会成功呢?那么必定是未进行任何设置的实体属性默认是IsOptional()。这跟表结构中的字段类型设置为Not Null有无关联呢,从测试结果看就本类应用无必然联系。

总结:

a.实体配置中指定了实体属性为IsRequired(),更新操作构造类的实例时必对此属性赋值。

b.不进行配置的实体属性默认为IsOptional()

c.表结构中字段是否为Not Null对上述规则无影响。

2 更新报错:

An object with the same key already exists in the ObjectStateManager. The ObjectStateManager cannot track multiple objects with the same key.

异常类型:System.Data.Entity.Infrastructure.DbUpdateConcurrencyException

实体属性配置如上例所示。

操作代码:

using (CustomDbContext db = new CustomDbContext())

{

User user = new User

{

Id = 1,

Email = "test@132.com",

};

DbEntityEntry entry = db.Entry(user);

entry.State = EntityState.Unchanged;

entry.Property(t => t.Email).IsModified = true;

User user1 = new User

{

Id = 1,

Email = "test@132.com",

};

DbEntityEntry entry1 = db.Entry(user1);

entry1.State = EntityState.Unchanged;

entry1.Property(t => t.Email).IsModified = true;

int num = db.SaveChanges();

}

执行操作

涉及到两次修改操作,两次操作构造了两个实例,但是实例的属性Id有相同的值。

如果两次操作的是同一个实例,而不是不同的实例,那么不会抛出异常,代码如下:

using (CustomDbContext db = new CustomDbContext())

{

User user = new User

{

Id = 1,

Email = "test@132.com",

};

DbEntityEntry entry = db.Entry(user);

entry.State = EntityState.Unchanged;

entry.Property(t => t.Email).IsModified = true;

DbEntityEntry entry1 = db.Entry(user);

entry1.State = EntityState.Unchanged;

entry1.Property(t => t.Email).IsModified = true;

int num = db.SaveChanges();

}

3 未给主键赋值或赋给主键一个不存在的值,抛出异常

System.Data.Entity.Infrastructure.DbUpdateConcurrencyException

操作代码如下,其中Id=1这条语句被注掉,Id是主键:

using (CustomDbContext db = new CustomDbContext())

{

User user = new User

{

//Id = 1,

Email = "test@132.com",

};

DbEntityEntry entry = db.Entry(user);

entry.State = EntityState.Unchanged;

entry.Property(t => t.Email).IsModified = true;

int num = db.SaveChanges();

}

运行上述代码,抛出异常信息如下,注意异常类型居然是System.Data.Entity.Infrastructure.DbUpdateConcurrencyException,看上去像是并发问题,但实际却不是!

Message:

Store update, insert, or delete statement affected an unexpected number of rows (0). Entities may have been modified or deleted since entities were loaded. Refresh ObjectStateManager entries.

赋给主键一个不存在的值,令Id=4(在数据库表中不存在Id为4的一条记录)抛出的异常与上面的相同。

4 字段超长抛出异常:System.Data.Entity.Validation.DbEntityValidationException

表中Nickname 字段定义为50个字符,现在赋值超过50。

操作代码如下:

using (CustomDbContext db = new CustomDbContext())

{

User user = new User

{

Id = 4,

Email = "test@132.com",

Nickname = "TestUpdateErrorTestUpdateErrorTestUpdateErrorTestUpdateErrorTestUpdateErrorTestUpdateErrorTestUpdateErrorTestUpdateErrorTestUpdateErrorTestUpdateErrorTestUpdateError"

};

DbEntityEntry entry = db.Entry(user);

entry.State = EntityState.Unchanged;

entry.Property(t => t.Email).IsModified = true;

int num = db.SaveChanges();

}

运行程序报错:

一层一层点开,查看具体原因:

c# ef报错_C#中Entity Framework常见报错汇总相关推荐

  1. onkeypress属性添加报错_亚马逊运营过程中listing常见报错及应对策略汇总

    亚马逊运营过程中listing常见报错及应对策略汇总 做亚马逊的小哥哥小姐姐们还在为上传产品中的报错提示而抓狂吗?福利来了,总结了17个常见报错,供大家查阅 1.SKU XXXXX, Missing ...

  2. python报错_python 常见报错

    python 常见报错 IndentationError: 缩进错误 IndentationError: expected an indented block 应为缩进快 必须统一使用tab 不能空格 ...

  3. 内置Jetty配置JSP支持过程中的常见报错

    目录 1. 常见报错及解决 1.1 JSP support not configured 1.2 JSTL标签解析 1.3 JSP编译 1.4 JSP实现依赖 1.5 EL表达式支持 2. 小结 1. ...

  4. TWINCAT3中使用FIFO收集三轴的位置信息,XML文件的生成,解决常见报错

    TWINCAT3中使用FIFO收集三轴的位置信息,XML文件的生成,解决常见报错 1.首先到官网下载程序 很多时候我们用twincat不具备硬件条件,需要用到虚轴进行测试,但是对于初学者来说,用twi ...

  5. ESlint 中常见报错的类型和解决方案

    ESlint 中常见报错的类型和解决方案 这是我在使用 eslint 过程中遇到的一些问题,和自己总结的一些,希望对大家有帮助. vue 中 quotes 报错 :不能使用双引号 " &qu ...

  6. java常问的报错_java常见报错及解决

    Java常见报错信息: Java Exception: 1.Error 2.Runtime Exception 运行时异常 3.Exception 4.throw 用户自定义异常 异常类分两大类型:E ...

  7. python计算机视觉常见报错及解决方案(不断更新中)

    python计算机视觉常见报错及解决方案 1.did not meet fit acceptance criteria 2.all the input arrays must have same nu ...

  8. 【全网最详细yolov6】yoloV6调试记录(含训练自己的数据集及常见报错及解决方法)--持续更新ing

    本文手把手教你如何调试最新的yolov6,复现运行COCO2017及训练自己的数据集,目前该项目刚发布,BUG会比较多,调起来一般不会那么顺利,本文含windows+ubuntu,并给出了一些常见问题 ...

  9. 关于Findbugs的一些常见报错的翻译和处理方式

    在Lab5中要求使用 CheckStyle 和 FindBugs 工具对经过人工走查的 Lab4 代码进行自动的静态代码分析.在使用FindBugs的过程中,出现了一些难以理解的报错,经查阅资料,了解 ...

最新文章

  1. 汪昭然:构建“元宇宙”和理论基础,让深度强化学习从虚拟走进现实
  2. JQuery变量数字相加的研究
  3. 25+AI技术主题演讲及项目展示!英特尔AI全球影响力嘉年华开启,全球AI人才线上群聚
  4. ux和ui_首先要做的— UX / UI案例研究
  5. micro asyn wininet
  6. git merge 与 git rebase的区别
  7. mysql insert插入的3种方法
  8. [ZJOI2009]取石子游戏
  9. 网管,请别随意关闭默认共享
  10. java输入无名粉_05·无名粉店(上)
  11. Linux下RTL8723BE无线网卡驱动问题解决方法
  12. 2020年5月面试精心整理java面试题,覆盖了大部分面试题(附答案)
  13. java POI 实现合并单元格
  14. c/c++ read 函数和 write 函数
  15. 下载mysql源码包
  16. OSChina 周四乱弹 ——世界欠你一个奥斯卡
  17. 《查令十字街84号》读后感
  18. 美图M8美战版、椰子鞋等潮品被疯抢是一种怎样的消费观?
  19. 小程序前端生成二维码的链接并携带参数
  20. opencv图像的轮廓特征

热门文章

  1. 2018蓝桥杯省赛java_蓝桥杯2018年A组省赛
  2. 基于stm32f405控制三相无刷电机例程_直流有刷电机和无刷电机的区别
  3. HbuilderX跳转 / 定义快捷键
  4. html5数组查找第二大数,2021-06-29:在两个都有序的数组中找整体第K小的数。
  5. Java SE有几个代码_JavaSE常用类及方法的介绍(附代码)
  6. 智慧树omg期末测试答案_智慧树答案广告文案写作单元期末见面课知到章节测试答案...
  7. java如何解决高并发症,一整套Java线上故障排查技巧,爱了!
  8. Java多线程-生产者与消费者
  9. plotly使用mapbox实现地图可视化
  10. 最后两周!60万奖金AI攻防赛进入冲刺(附baseline代码及实操)