我基本上得到了一个如下所示的循环:
foreach(var file in files)
{
// ...
db.Images.Add(new ImageFingerPrint { FileName = file, FingerPrint = fingerprint });
}
int recordsAffected = db.SaveChanges();
FileName
是PK。如果它已存在于数据库中,我只希望它更新其FingerPrint
。我想基本上做REPLACE。
如果这不容易/可能,我如何简单地截断整个表?
答案 0 :(得分:2)
您可以使用
截断表格db.Images.Clear();
db.SaveChanges();
假设没有外键约束。
如果您想获取现有项目,请尝试LINQ查询:
var existing = (from im in db.Images
where im.FileName.Equals(file)
select im).SingleOrDefault();
if(existing != null)
existing.FingerPrint = fingerprint;
else
db.Images.Add(...)
db.SaveChanges();
答案 1 :(得分:2)
我使用的常用模式是
foreach(var file in files)
{
var image = db.Images.SingleOrDefault(i => i.FileName == file);
if (item == null)
{
image = new ImageFingerPrint() { FileName = file };
db.Images.Add(image);
}
image.FingerPrint = fingerprint;
}
db.SaveChanges();
当对象具有一些数据库生成的字段(如IDENTITY
主键,CreatedDate
列或时间戳)时,这将变得更容易。然后检查这些字段是否为默认值很简单,如果它们是对象是新的,则应该“添加”。
根据循环的复杂程度,您可能需要预先确定“现有”和“新”文件名 -
var existing = files.Where(f => db.Images.Contains(f));
// & use .ToList() if you're going to be iterating the collection multiple times
foreach (file in existing)
{
// updates
}
foreach (var file in files.Except(existing))
{
// inserts
}
当有性能优势时,我会使用这种方法 - 例如其中一个操作可以作为批量操作完成,另一个操作不能。否则,如果插入和更新操作明显不同,它可以使代码更清晰。