在实体框架6.1中保存更改之前检查是否存在
本文关键字:检查 是否 存在 保存更改 实体 框架 | 更新日期: 2023-09-27 18:25:54
我需要处理来自外部系统的文本文件。我的代码(C#)如下:
foreach (var parsedFileLine in parsedFileData)
{
var container = context.Containers
.FirstOrDefault(c => c.Label == parsedFileLine.ccoid);
if (container == null)
{
container = context.Containers.Create();
container.Label = parsedFileLine.ccoid;
// More initialization logic
...
context.Containers.Insert(container);
}
// Some more processing
...
}
context.SaveChanges();
DB在"标签"列上有一个"唯一"约束。如果我收到一个文件,每个容器有一行,那么一切都很好。但是,当我收到一个有2行以上引用新容器的文件时,我会收到一个Containt违规。
问题是,我对第二个文件行的存在性检查失败了(因为SaveChanges还没有被调用,因此还没有在DB中创建新的Container),所以我试图再次创建容器。当提交更改时,DB抛出异常,因为我正试图插入具有相同标签的两行。
我第一次想到使用Find(),但由于这是一个新实体,所以我没有要搜索的Key。将SaveChanges放入循环中也不是一个选项,因为我需要对文件进行事务处理。由于所涉及的工作量,将PK更改为Label不是一个选项。
关于如何解决这个问题有什么想法吗?
一个可能的解决方案是编写一个预处理方法。
此方法将包含您当前的DB容器值,以及另一个存储刚刚添加的Container值的tempContainer。插入前检查两个容器。
List MyDBList;
List MyTempList;
Foreach(item)
{
checkMyDBList(item);
checkMyTempList(item);
if(checkbothlist)
MyTempList.add(item);
}
add MyTempList to MyDBList
save MyDBList