【发布时间】:2017-06-01 19:26:56
【问题描述】:
实体框架 6.0;视觉工作室 15; SQL 2016;
DbUpdateException.Entries 一次只生成一个条目。
我正在尝试将多个项目添加到数据库中。当我调用 .SaveChanges() 时,由于重复键,它会生成 DbUpdateException。我尝试使用以下代码消除具有重复键的条目:
public void SaveDB(CEntities db)
{
bool savecompleted = false;
while (!savecompleted)
{
savecompleted = true;
try
{
db.SaveChanges();
}
catch (DbUpdateException updateex)
{
foreach (DbEntityEntry item in updateex.Entries)
item.State = EntityState.Detached;
savecompleted = false;
}
}
}
我的理解是 DbUpdateException.Entries 应该包含所有失败的实体。我一次只得到一个实体。如果我尝试添加 500 个实体并且它们都是重复的,它将尝试调用 .SaveChanges() 500 次。
我错过了什么
添加实体的代码是:
public void CreateActivity()
{
CEntities db = new CEntities();
commentfield = GetComment();
var scans = from x in dt.AsEnumerable() where x.Field<string>("Printid") != "0000000" group x by x.Field<string>("Printid") into p select new { printid = p.Key, Qty = p.Count(), date = p.Max(x => x.Field<DateTime>(timefield)) };
foreach (var scan in scans)
{
int jobno =
(from x in db.ManifestDatas where x.PrintId == scan.printid select x.JobNo).FirstOrDefault();
JobActivity activity = new JobActivity();
activity.Activity = activityfield;
activity.Employee = int.Parse(scan.printid);
activity.ActivityDate = scan.date;
activity.Quantity = scan.Qty;
activity.JobNo = jobno;
activity.Comment = commentfield;
db.JobActivities.Add(activity);
}
SaveDB(db);
}
【问题讨论】:
-
向我们展示将条目添加到上下文的代码可能会更清楚。
-
这里哪一列是主键列?
-
主键是多列(Activity,Employee,ActivityDate,Jobno)。我明白为什么会出现异常,我想弄清楚为什么
DbUpdateException.Entries一次只返回一个项目。
标签: c# entity-framework exception-handling