c# ef报错_C#中Entity Framework常见报错汇总
以下小编整理的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常见报错汇总相关推荐
- onkeypress属性添加报错_亚马逊运营过程中listing常见报错及应对策略汇总
亚马逊运营过程中listing常见报错及应对策略汇总 做亚马逊的小哥哥小姐姐们还在为上传产品中的报错提示而抓狂吗?福利来了,总结了17个常见报错,供大家查阅 1.SKU XXXXX, Missing ...
- python报错_python 常见报错
python 常见报错 IndentationError: 缩进错误 IndentationError: expected an indented block 应为缩进快 必须统一使用tab 不能空格 ...
- 内置Jetty配置JSP支持过程中的常见报错
目录 1. 常见报错及解决 1.1 JSP support not configured 1.2 JSTL标签解析 1.3 JSP编译 1.4 JSP实现依赖 1.5 EL表达式支持 2. 小结 1. ...
- TWINCAT3中使用FIFO收集三轴的位置信息,XML文件的生成,解决常见报错
TWINCAT3中使用FIFO收集三轴的位置信息,XML文件的生成,解决常见报错 1.首先到官网下载程序 很多时候我们用twincat不具备硬件条件,需要用到虚轴进行测试,但是对于初学者来说,用twi ...
- ESlint 中常见报错的类型和解决方案
ESlint 中常见报错的类型和解决方案 这是我在使用 eslint 过程中遇到的一些问题,和自己总结的一些,希望对大家有帮助. vue 中 quotes 报错 :不能使用双引号 " &qu ...
- java常问的报错_java常见报错及解决
Java常见报错信息: Java Exception: 1.Error 2.Runtime Exception 运行时异常 3.Exception 4.throw 用户自定义异常 异常类分两大类型:E ...
- python计算机视觉常见报错及解决方案(不断更新中)
python计算机视觉常见报错及解决方案 1.did not meet fit acceptance criteria 2.all the input arrays must have same nu ...
- 【全网最详细yolov6】yoloV6调试记录(含训练自己的数据集及常见报错及解决方法)--持续更新ing
本文手把手教你如何调试最新的yolov6,复现运行COCO2017及训练自己的数据集,目前该项目刚发布,BUG会比较多,调起来一般不会那么顺利,本文含windows+ubuntu,并给出了一些常见问题 ...
- 关于Findbugs的一些常见报错的翻译和处理方式
在Lab5中要求使用 CheckStyle 和 FindBugs 工具对经过人工走查的 Lab4 代码进行自动的静态代码分析.在使用FindBugs的过程中,出现了一些难以理解的报错,经查阅资料,了解 ...
最新文章
- 汪昭然:构建“元宇宙”和理论基础,让深度强化学习从虚拟走进现实
- JQuery变量数字相加的研究
- 25+AI技术主题演讲及项目展示!英特尔AI全球影响力嘉年华开启,全球AI人才线上群聚
- ux和ui_首先要做的— UX / UI案例研究
- micro asyn wininet
- git merge 与 git rebase的区别
- mysql insert插入的3种方法
- [ZJOI2009]取石子游戏
- 网管,请别随意关闭默认共享
- java输入无名粉_05·无名粉店(上)
- Linux下RTL8723BE无线网卡驱动问题解决方法
- 2020年5月面试精心整理java面试题,覆盖了大部分面试题(附答案)
- java POI 实现合并单元格
- c/c++ read 函数和 write 函数
- 下载mysql源码包
- OSChina 周四乱弹 ——世界欠你一个奥斯卡
- 《查令十字街84号》读后感
- 美图M8美战版、椰子鞋等潮品被疯抢是一种怎样的消费观?
- 小程序前端生成二维码的链接并携带参数
- opencv图像的轮廓特征
热门文章
- 2018蓝桥杯省赛java_蓝桥杯2018年A组省赛
- 基于stm32f405控制三相无刷电机例程_直流有刷电机和无刷电机的区别
- HbuilderX跳转 / 定义快捷键
- html5数组查找第二大数,2021-06-29:在两个都有序的数组中找整体第K小的数。
- Java SE有几个代码_JavaSE常用类及方法的介绍(附代码)
- 智慧树omg期末测试答案_智慧树答案广告文案写作单元期末见面课知到章节测试答案...
- java如何解决高并发症,一整套Java线上故障排查技巧,爱了!
- Java多线程-生产者与消费者
- plotly使用mapbox实现地图可视化
- 最后两周!60万奖金AI攻防赛进入冲刺(附baseline代码及实操)