2011-12-14 12 views

答えて

7

コンテキストの種類と生成されたエンティティによって、いくつかの方法で行うことができます。 EntityまたはPOCOから継承したオブジェクトの場合は、セルフトラッキングエンティティの場合はObjectStateManagerを使用できます。エンティティ自体からトラッカーを使用することができます。

EDITED

を変更する(2)あなたは、コンテキストを生成する方法と、あなたが作るどのような方法の詳細を提供してください: あなたは、単にこのような変更されたエントリのObjectStateManagerを照会することができます

var changed = ctx.ObjectStateManager.GetObjectStateEntries().Where(e=>e.State != EntityState.Unchanged); 

EDITED( 1):MSDNから

次の例では、変更を照会する方法を示します。

int orderId = 43680; 

using (AdventureWorksEntities context = 
new AdventureWorksEntities()) 
{ 
var order = (from o in context.SalesOrderHeaders 
      where o.SalesOrderID == orderId 
      select o).First(); 

// Get ObjectStateEntry from EntityKey. 
ObjectStateEntry stateEntry = 
    context.ObjectStateManager 
    .GetObjectStateEntry(((IEntityWithKey)order).EntityKey); 

//Get the current value of SalesOrderHeader.PurchaseOrderNumber. 
CurrentValueRecord rec1 = stateEntry.CurrentValues; 
string oldPurchaseOrderNumber = 
    (string)rec1.GetValue(rec1.GetOrdinal("PurchaseOrderNumber")); 

//Change the value. 
order.PurchaseOrderNumber = "12345"; 
string newPurchaseOrderNumber = 
    (string)rec1.GetValue(rec1.GetOrdinal("PurchaseOrderNumber")); 

// Get the modified properties. 
IEnumerable<string> modifiedFields = stateEntry.GetModifiedProperties(); 
foreach (string s in modifiedFields) 
    Console.WriteLine("Modified field name: {0}\n Old Value: {1}\n New Value: {2}", 
     s, oldPurchaseOrderNumber, newPurchaseOrderNumber); 

// Get the Entity that is associated with this ObjectStateEntry. 
SalesOrderHeader associatedEnity = (SalesOrderHeader)stateEntry.Entity; 
Console.WriteLine("Associated Enity's ID: {0}", associatedEnity.SalesOrderID); 
} 
+0

ウィザードを使用してdbからモデルを生成しました。典型的なコードrepo.entity.value = newvalueを変更する – Kumar

+0

拡張応答を参照してください。 – vittore

+0

「テーブル」がグリッドにバインドされているかのように、ユーザーは行を変更しますが、どちらが先になっているのかわかりません!またはリスト内の各レコードのObjectStateEntryを取得して保存する必要がありますか(簡単に10000を超えるエントリがある可能性があります) – Kumar

2

通常、データベース構造自体を使用してこれを行うことをお勧めします。 これは、あなたが現在持っているものに対するもう一つのアプローチです。

タイプdatetimeという新しいフィールドをテーブルModifiedOnに作成し、データベースの行を更新するたびに更新することができます。

は、その後、あなたが変更された行をしたいときにだけ使用して、特定の時間後:

where ModifiedOn > dateTime 

それはあなたが別の角度から問題にアプローチする方法のちょうど別の提案です。

+0

一般的に、手動でする必要はありませんフィールドを更新するには、そのタイムスタンプ専用のフィールドタイプがあります。このアプローチは完全に理にかなっていますが、変更の時間を得ることができます。実際の変更を手動で取得する必要があります。新しいレコードと一緒に元のレコードを維持するだけで済むようにするか、クエリログ(SQL Serverで)などのより洗練された方法を使用する必要があります。 一方、EntityFrameworkはDBへの更新を実行する前にすでにこの情報を保持しているので、この既存のデータを使用することはかなり明白です。 – vittore

+0

@vittore - True。完全にあなたと同意します。私はちょうどこの特定の問題のために他のアプローチがあることを指摘したいと思った。 – TheBoyan

関連する問題