2011-10-18 7 views
1

解決しやすいと思っていた問題があります。 これは私のシナリオです(自己追跡を使用しているエンティティフレームワーク4の接続されていないエンティティ)。 私は2つのエンティティを持っているとしましょう:ユーザ、注文。 asp.netページからデータベースから1人のユーザーと1つの注文を取得します。エンティティフレームワークの自己追跡エンティティでの更新

const int userId = 1; 
const int orderId = 1; 
var userManager = new UserManager(); 
var orderManager = new OrderManager(); 
var user = userManager.GetUser(userId); 
var order = channelManager.GetChannel(channelId); 

user.Orders.Add(order); 

ここで、注文を追加するユーザーを更新する関数を作成する必要があります。

私のような何かを書いた:私はこの機能にエラーがあり、すべてをデバッグしていない

public bool UpdateUser(User user) 
{ 
    context.AttachTo("Users", user); 

    var stateMgr = context.ObjectStateManager; 
    var stateEntry = stateMgr.GetObjectStateEntry(user); 

    for (int i = 0; i < stateEntry.CurrentValues.FieldCount; i++) 
    { 
      bool isKey = false; 

      string name = stateEntry.CurrentValues.GetName(i); 

      foreach (var keyPair in stateEntry.EntityKey.EntityKeyValues) 
      { 
        if (string.Compare(name, keyPair.Key, true) == 0) 
        { 
          isKey = true; 
          break; 
        } 
      } 
      if (!isKey) 
      { 
        stateEntry.SetModifiedProperty(name); 
      } 
    } 

    context.ApplyCurrentValues("Users", user); 

    return context.SaveChanges() > 0; 
} 

を私は期待通りのエンティティが更新されていないデータベースを確認したら、OKのようですが、。 私は、切断されたエンティティが単純なものだったと思っていましたが、明らかにそうではありません。 誰かが私にEF4との接続されていないオブジェクトのグラフ全体を更新するロジックを解説できますか?私が論理を覆す必要があり、見るべきリンクの集まりを持っていなければなりませんか。私はすでにインターネットを見ている時間を過ごしましたが、どれが正しいかわからないほど多くのアトラクションを見つけています。

ありがとうございました

答えて

1

コード内に自己追跡エンティティに関連するものはありません。とにかくASP.NET don't work very wellのSTEs。

あなたのコードは何をすべきですか?これをやりたいと思うようです:

public bool UpdateUser(User user) 
{ 
    context.AttachTo("Users", user); 
    context.ObjectStateManager.ChangeObjectState(user, EntityState.Modified); 
    return context.SaveChanges() > 0; 
} 

しかし、それはwill not save relationsです。切り離されたグラフを扱うことについて、私はちょうどrelated questionに答えました。

0

セルフトラッキングエンティティでは、代わりにコンテキストで変更を同期させるためにApplyChanges()メソッドを使用する必要があります(添付しません)。

applychangesはリンクされたオブジェクト/コレクションを更新するためにグラフに移動します。

Public Function UpdateEntity(entity As Entity) As Entity 

    Using dbContext As New EntityContext() 
     dbContext.EntitySet.ApplyChanges(entity) 
     dbContext.SaveChanges() 

     dbContext.Refresh(Objects.RefreshMode.StoreWins, entity) 
    End Using 

    Return entity 
End Function 

リフレッシュはオプションです。ここでは、データベースの最後の値をプッシュバックするだけです。ところで、リフレッシュはリンクされたオブジェクトを更新しません。

関連する問題