记录重复导致没有记录插入

时间:2018-12-17 11:43:49

标签: c# entity-framework linq linq-to-entities c#-6.0

请考虑以下情况:

我有两个表:TempConvert。这两个表的结构完全相同。我想对Temp的每条记录进行一些操作,并将其添加到Convert表中。通过执行我的工作,Convert表中可能有重复的记录,因此我不想在Convert表中插入该记录。我写了这段代码:

foreach (var item in allRecords)
{
    var converted = new Convert()
    {
        F1 = item.F1,
        F2 = item.F2,
        F3 = DoWork(F3),
    };

    try
    {
        context.Convert.AddObject(converted);
        context.SaveChanges();
    }
    catch (Exception ex)
    {
        var msg = "Violation of PRIMARY KEY constraint 'PK_Convert'." 
                  + " Cannot insert duplicate key":

        if (ex.InnerException.Message.Contains(msg))
        {
            continue;
        }
        else
        {
             throw ex;
        }
    }
}

问题是,当我得到第一个重复项并执行continue命令的异常时,似乎重复记录没有被丢弃而仍在等待保存。在第一个例外之后–由于我的第一个重复错误,没有记录存储在数据库中。如何在不检查Convert表中是否存在重复错误的情况下解决此问题?

谢谢

2 个答案:

答案 0 :(得分:0)

您可以尝试检查该实体是否存在,如果不存在,请添加它?像这样:

using System.Linq.Expressions;
public class ContextWithExtensionExample
{
    public void DoSomeContextWork(DbContext context)
    {
        var uni = new Unicorn();
        context.Set<Unicorn>().AddIfNotExists(uni , x => x.Name == "James");
     }
}

public static class DbSetExtensions
{
    public static T AddIfNotExists<T>(this DbSet<T> dbSet, T entity, Expression<Func<T, bool>> predicate = null) where T : class, new()
    {
        var exists = predicate != null ? dbSet.Any(predicate) : dbSet.Any();
        return !exists ? dbSet.Add(entity) : null;
    }
}

您可以直接使用此方法,并记住在调用之后调用DbContext.SaveChanges()。

答案 1 :(得分:0)

var converted = new Convert()
    {
        F1 = item.F1,
        F2 = item.F2,
        F3 = DoWork(F3),
    };

由于F3是您的主键,所以只需在插入前检查它是否存在:

if(context.Convert.Any(x => x.F3 == converted.F3)
{
    //deal with the error
}
else
{
     context.Convert.AddObject(converted);
     context.SaveChanges();
}