私は、ASP.NET MVC3 環境の Entity Framework 5 内でレコードを編集/更新するさまざまな方法を検討してきましたが、これまでのところ、必要な条件をすべて満たす方法はありません。その理由を説明します。
私は 3 つの方法を見つけました。それぞれの長所と短所を挙げます。
方法1 - 元のレコードを読み込み、各プロパティを更新する
var original = db.Users.Find(updatedUser.UserId);
if (original != null)
{
original.BusinessEntityId = updatedUser.BusinessEntityId;
original.Email = updatedUser.Email;
original.EmployeeId = updatedUser.EmployeeId;
original.Forename = updatedUser.Forename;
original.Surname = updatedUser.Surname;
original.Telephone = updatedUser.Telephone;
original.Title = updatedUser.Title;
original.Fax = updatedUser.Fax;
original.ASPNetUserId = updatedUser.ASPNetUserId;
db.SaveChanges();
}
長所
- どのプロパティを変更するか指定できる
- ビューにはすべてのプロパティを含める必要はない
短所
- オリジナルをロードして更新するためにデータベースに2回クエリを実行する
方法2 - 元のレコードを読み込み、変更された値を設定する
var original = db.Users.Find(updatedUser.UserId);
if (original != null)
{
db.Entry(original).CurrentValues.SetValues(updatedUser);
db.SaveChanges();
}
長所
- 変更されたプロパティのみがデータベースに送信されます
短所
- ビューにはすべてのプロパティを含める必要がある
- オリジナルをロードして更新するためにデータベースに2回クエリを実行する
方法 3 - 更新されたレコードを添付し、状態を EntityState.Modified に設定する
db.Users.Attach(updatedUser);
db.Entry(updatedUser).State = EntityState.Modified;
db.SaveChanges();
長所
- 更新するデータベースに対するクエリ x 1
短所
- どのプロパティが変更されるかを指定できません
- ビューにはすべてのプロパティが含まれている必要があります
質問
皆さんに質問です。この一連の目標を達成できる明確な方法はあるでしょうか?
- どのプロパティを変更するか指定できる
- ビューにはすべてのプロパティ (パスワードなど) を含める必要はありません。
- 更新するデータベースに対するクエリ x 1
これは指摘すべき些細なことだと理解していますが、簡単な解決策を見逃している可能性があります。そうでなければ、方法 1 が優先されます ;-)
ベストアンサー1
あなたは探している:
db.Users.Attach(updatedUser);
var entry = db.Entry(updatedUser);
entry.Property(e => e.Email).IsModified = true;
// other changed properties
db.SaveChanges();