0

我基本上有一个看起来像这样的循环:

foreach(var file in files)
{
    // ...
    db.Images.Add(new ImageFingerPrint { FileName = file, FingerPrint = fingerprint });
}

int recordsAffected = db.SaveChanges();

FileName是PK。如果它已经存在于数据库中,我只想让它更新它FingerPrint。我想基本上是在做一个替换。

如果这不容易/可能,我该如何简单地截断整个表格?

4

2 回答 2

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
}

当有性能优势时,我会使用这种方法 - 例如,其中一个操作可以作为批量操作完成,而另一个则不能。否则,如果插入和更新操作明显不同,它可以使代码更清晰。

于 2012-04-22T22:59:46.157 回答
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();
于 2012-04-22T19:06:10.013 回答