工作单元+存储库模式+实体框架4:单个事务中尚未保存在数据库中的记录的依赖性
本文关键字:保存 数据库 依赖性 记录 事务 存在 单个 存储 单元 模式 实体 | 更新日期: 2023-09-27 18:21:17
我正在使用工作单元+通用存储库模式+实体框架4开发MVC4应用程序。
现在,我想根据excel文件中的一些逻辑,在表中插入/更新员工休假记录。
例如
Employeeleave表中的记录
id |雇员id | DOH | DOT
1 | 233 | 2010年1月1日| 2010年2月1日
2 | 233 | 2010年3月1日| 2010年4月1日
现在插入记录的逻辑是1) 如果DOT一个记录和DOH下一个记录之间的差异小于2周,那么我们必须用第二个记录更新第一个记录DOT。并删除第二条记录2) else更新与表中的记录重叠的记录
现在,在一个excel表格文件中,同一员工有两条记录
excel文件中的记录
sr编号|雇员ID | DOH | DOT
1 | 233 | 2010年1月20日| 2010年2月15日
2 | 233 | 2010年3月20日| 2010年4月21日
代码
List<Employeeleave> lstEmp = unitofwork.employeeleaveRepository().get(x=>x.id==empid)
for( var emp in Employeeleave)
{
// for each record check the diffrence between DOT of this record if avaialble amd DOH of next record
// if valid as per logic then update current and delete next record
}
unitofwork.save(); //save all DML at once
现在,根据这个例子,当excel中的第一条记录与数据库记录进行比较时,当事务完成时,它会从表中删除第二条记录;当excel中的第二条记录与第二条纪录进行比较时,它只会尝试更新第二条但在第一次DML操作中,excel文件中的第一条记录正在删除表中的第二条记录。
那么,这种情况的解决方法是什么呢?
我需要调用unitofwork.save()吗;每次循环后?在这种情况下,如果在处理excel文件中的第二条记录时出现错误怎么办?我希望所有的文件记录都被处理或者什么都不处理。
谢谢,阿莫尔
我需要调用unitofwork.save()吗;每次循环后?
这是一种糟糕的方法,请避免。每次对数据库的调用都是资源贪婪的。
通过添加带有对象状态的标志,您可以简单地解决问题
使用EntityState
或创建自己的状态。
然后在DeleteEntity(Entity entity)
方法中设置
entity.State = EntityState.Deleted;
然后在第二种情况下忽略已删除的对象。
最后提交数据,因此EF保存所有更改。