2

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();

部分的なオブジェクト (特定のナビゲーション プロパティを設定せずに) を取得し、最初にロードせずにデータベースを更新する方法はありますか?

4

1 に答える 1

0

サイトとプロジェクトの間に論理的な関係があるため、エンティティをさらに正規化する必要があることを発見しましたが、その関係は常に必要なわけではありません。

必要なエンティティの粒度を取得するには、サイトとプロジェクトの間の直接的な関係を多対多の相互参照テーブルに変更して、プロジェクトに関係なくサイトで作業できるようにする必要があります。

サイト: ID

SiteProjectRef: SiteID (Site.ID) ProjectID (Project.ID)

プロジェクト: ID


もちろん、別の方法として、更新する前にサイトを読み込んでコンテンツをマージすることもできます。しかし、あなたはそこに行きたくないと言いました。

于 2013-08-13T15:05:10.990 に答える