WebApi アプリケーションがあり、いくつかの POST/PUT メソッドに取り組んでおり、エンティティ フレームワークを使用してデータベース内のレコードを更新する最適な方法を見つけようとしています。
WebApi を使用する際の主な問題は、リクエストが完全なオブジェクトの完全なプロパティのサブセットのみを持つことです。
たとえば、関連するプロジェクトを指すナビゲーション オブジェクトSite
を持つオブジェクトがあります。Project
現在、サイトはプロジェクトを移動できないため、Project
オブジェクトSite
が空であることを意味する PUT コマンドで projectId を提供していません。これにより、更新しようとしたときに問題が発生します (そのプロパティが変更されていないと述べている場合でも)。最初にレコードを読み取り、次に変更をマージしてから、次のように永続化します。
以下の例の明確さ。サイトはパラメータとして PUT ルートに渡されるオブジェクトであるため、この場合は部分的なサイト オブジェクトです。
//Grab the existing site
var dbSite = (from s in _repo
where s.Id == id
select s).FirstOrDefault();
//Update unchanged values
site.Id = id;
site.CreatedOn = dbSite.CreatedOn;
var entry = _uow.Entry(dbSite);
entry.Property(e => e.Code).IsModified = true;
entry.Property(e => e.Active).IsModified = true;
entry.Property(e => e.CreatedOn).IsModified = false;
_uow.Entry(dbSite).CurrentValues.SetValues(site);
//Commit
_uow.Commit();
部分的なオブジェクト (特定のナビゲーション プロパティを設定せずに) を取得し、最初にロードせずにデータベースを更新する方法はありますか?