私がよく使うパターンは
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
}
私はこのアプローチを、パフォーマンス上の利点がある場合に使用します。たとえば、操作の 1 つを一括操作として実行でき、もう 1 つを実行できない場合などです。それ以外の場合は、挿入操作と更新操作が大幅に異なる場合、コードをより明確にすることができます。