请考虑以下情况:
我有两个表:Temp
和Convert
。这两个表的结构完全相同。我想对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
表中是否存在重复错误的情况下解决此问题?
谢谢
答案 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();
}