在Entity Framework 6.1中的SaveChanges之前检查是否存在

时间:2015-12-05 00:49:18

标签: c# entity-framework-6 unique-constraint

我需要处理来自外部系统的文本文件。我的代码(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在Label列上有唯一约束。如果我收到一个文件,每个容器有一行,一切正常。但是当我收到一个涉及新容器的2行以上的文件时,我会收到违规行为。

问题是我对第二个文件行的检查存在失败(因为尚未调用SaveChanges,因此尚未在DB中创建新的Container),所以我尝试再次创建容器。提交更改时,数据库会抛出异常,因为我正在尝试插入具有相同Label的两行。

我首先想到使用Find(),但由于这是一个新实体,我没有要搜索的Key。将SaveChanges置于循环中也不是一种选择,因为我需要对文件进行事务处理。由于涉及的工作量很大,因此将PK更改为标签不是一种选择。

关于如何解决这个问题的任何想法?

1 个答案:

答案 0 :(得分:0)

可能的解决方案是编写预处理方法。

此方法将包含您当前的数据库容器值,以及另一个存储刚添加的Container值的tempContainer。 插入前检查两个容器。

List MyDBList;
List MyTempList;

Foreach(item)
{
  checkMyDBList(item);
  checkMyTempList(item);

  if(checkbothlist)
  MyTempList.add(item);
}
add MyTempList to MyDBList
save MyDBList