擅长:python、mysql、java
<p>我能想到的最好的办法是:</p>
<pre><code>var ids = new List<int>(){1,2,3,4,5,6,7};
var records = db.Records.Where(x=> ids.Contains(x.Id));
try
{
foreach(var i in ids)
{
var record = records.FirstOrDefault(x=>x.Id == i);
if(record == null)
{
throw new Exception($"Record with Id {i} not found");
}
record.Foo = "Bar";
}
db.saveChanges();
}
catch(Exception ex)
{
//roll back changes
var changedEntries = db.ChangeTracker.Entries()
.Where(x => x.State != EntityState.Unchanged).ToList();
foreach(var entry in changedEntries)
{
db.Entry(entry).State = EntityState.Unchanged;
}
}
</code></pre>
<p>这里的理由是EF隐式地使用一个事务,当您调用.SaveChanges()时,该事务是“提交的”。如果出现问题,只需将实体的状态重置为“未更改”,并且从不调用SaveChanges()</p>