工作单元+存储库模式+实体框架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文件中的第二条记录时出现错误怎么办?我希望所有的文件记录都被处理或者什么都不处理。

谢谢,阿莫尔

工作单元+存储库模式+实体框架4:单个事务中尚未保存在数据库中的记录的依赖性

我需要调用unitofwork.save()吗;每次循环后?

这是一种糟糕的方法,请避免。每次对数据库的调用都是资源贪婪的。

通过添加带有对象状态的标志,您可以简单地解决问题
使用EntityState或创建自己的状态。

然后在DeleteEntity(Entity entity)方法中设置

entity.State = EntityState.Deleted;

然后在第二种情况下忽略已删除的对象。

最后提交数据,因此EF保存所有更改。