変更されたフィールドのリストのみを取得する必要があります。データストアはssceなので、トリガーは使用できません。EFでエンティティ変更デルタを取得する方法は?
リストを取得したり、汎用コンポーネントを作成するサポートはありますか?
変更されたフィールドのリストのみを取得する必要があります。データストアはssceなので、トリガーは使用できません。EFでエンティティ変更デルタを取得する方法は?
リストを取得したり、汎用コンポーネントを作成するサポートはありますか?
コンテキストの種類と生成されたエンティティによって、いくつかの方法で行うことができます。 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);
}
通常、データベース構造自体を使用してこれを行うことをお勧めします。 これは、あなたが現在持っているものに対するもう一つのアプローチです。
タイプdatetime
という新しいフィールドをテーブルModifiedOn
に作成し、データベースの行を更新するたびに更新することができます。
は、その後、あなたが変更された行をしたいときにだけ使用して、特定の時間後:
where ModifiedOn > dateTime
それはあなたが別の角度から問題にアプローチする方法のちょうど別の提案です。
一般的に、手動でする必要はありませんフィールドを更新するには、そのタイムスタンプ専用のフィールドタイプがあります。このアプローチは完全に理にかなっていますが、変更の時間を得ることができます。実際の変更を手動で取得する必要があります。新しいレコードと一緒に元のレコードを維持するだけで済むようにするか、クエリログ(SQL Serverで)などのより洗練された方法を使用する必要があります。 一方、EntityFrameworkはDBへの更新を実行する前にすでにこの情報を保持しているので、この既存のデータを使用することはかなり明白です。 – vittore
@vittore - True。完全にあなたと同意します。私はちょうどこの特定の問題のために他のアプローチがあることを指摘したいと思った。 – TheBoyan
ウィザードを使用してdbからモデルを生成しました。典型的なコードrepo.entity.value = newvalueを変更する – Kumar
拡張応答を参照してください。 – vittore
「テーブル」がグリッドにバインドされているかのように、ユーザーは行を変更しますが、どちらが先になっているのかわかりません!またはリスト内の各レコードのObjectStateEntryを取得して保存する必要がありますか(簡単に10000を超えるエントリがある可能性があります) – Kumar