2

EF STEをしばらく使用していましたが、アプリケーションがかなり成長しており、新しい4.1 DbContextを訴えて、別のビジネスレイヤを「進化させる」ことができました。私たちのデータ層は異なるタイプを使用する必要はありません。EF 4.1 DBContextとナビゲーションプロパティ

DbContextのやり方についての基本評価では、少し問題に直面しています。

私は照会するために使用していますし、プリロードは次のように関連するデータを必要と:

return context.Orders.Include("Detail").SingleOrDefault(ord => ord.ID == ID); 

そして修正するためのUIに返されたオブジェクトを送信し、UIから返されたときに、データベースへの変更を保存します。私はDbContextで「保存変更」をやって、これまでに読んだものから、

は簡単にこのようなコードを使用して行われます:

context.Entry(order).State = EntityState.Modified; 

このコードの問題は、それが実際にオブジェクトとしてのすべてのプロパティをマークしていることです私のモデル(ビジネスルール)のいくつかのプロパティで許可されていないもの。

私は(比較的小規模な要件のための多くのコードを必要とするように思われるところで、変更なしに変更、プロパティの状態を変更すると、サポートされていません!)、次のソリューションに頼っ:

context.Orders.Attach(order); 

DbEntityEntry<Order> ordEntity = context.Entry(order); 

string[] arr = 
{ 
     ordEntity.Property(ord => ord.ID).Name, 
     ordEntity.Property(ord => ord.ClientID).Name, 
}; 

foreach (string prop in ordEntity.OriginalValues.PropertyNames) 
{ 
     if (!arr.Contains(prop)) 
     { 
      ordEntity.Property(prop).IsModified = true; 
     } 
} 

context.SaveChanges(); 

私は問題をこのコードでは、「Attach」ステートメントは、何も変更が加えられていない場合でも、添付オブジェクトのナビゲーションプロパティに何らかの矛盾があるとの例外をスローしています。 (データベースから取得したオブジェクトを正確に保存します)。 エラーメッセージは次のようなものです: "'OrdersDatamodel.FK_Order_Detail'という関係の 'Detail'ロールに対する矛盾した変更が検出されました。

質問は以下のとおりです。

  1. は、特定のオブジェクトのプロパティの変更を防止するため、より「エレガント」な方法はありますか?
  2. コンテキストにオブジェクトを接続するときに発生した例外について、誰が何を知っていますか?

ありがとうございます。私はDbContextで「保存変更」をやって、これまでに読んだものから、

+0

誰でも助けてください! – wassim

答えて

2

は簡単にこのようなコードを使用して行われます:

context.Entry(order).State = EntityState.Modified;

あなたはめったに明示的に状態を設定する必要はありません。プロパティを変更すると、それらがvirtualであると仮定すると、設定する必要はなく、状態は自動的にModifiedに変更されます。そうでない場合は、SaveChangesに電話をしている間にDetectChangesがこれを選択します。

+0

私はもうこのコードを使用していません。私の質問で言及したように、私は手動でコンテキストに(オブジェクトを "Unchanged"状態のままにしておく)オブジェクトを手動で接続し、手動で変更できるプロパティにマークを付けなければなりませんでした。とにかくありがとう。 – wassim

+0

しかし、私が作ろうとしているのは、あなたが問題ではない問題を解決しようとしているということです。エンティティ/プロパティを変更したものとして手動でマークする必要はありません.EFがそれを実行するためです。 – hvd

+0

あなたが話している既定の動作での私の問題は、それが任意のプロパティの変更を可能にするということです。私は、特定のプロパティの変更を許可することはできませんので、指定されたプロパティのセットだけが変更されたとしてフラグが立てられるようにする必要があります(フラグが自動的にまたは手動で発生するかどうかは実際問題ではありません。読み込み専用のプロパティの "un-flag"が失敗しました!)。 – wassim

関連する問題