Linq.DataContext
を使用している場合、実際には変更が記録されます。
参照する関数はSystem.Data.Linq.DataContext.GetChangeSetです。 GetChangeSet
はいつでも呼び出すことができますが、MSDNのドキュメントのRemarksセクションを参照するとよいでしょう。
あなたが提出する上で行動を取る/確認することができます...ここで
あなたはDataContext
にSubmitChanges
をオーバーライドし、その時点でのアクションを取ることができる方法の簡単な例です。
例が提出し、最終的な、あなたも追跡することができますし、特定のメンバーが更新されると、特別な行動を取る前に、あなたがデータを変更することができることを示しています
namespace ExampleProject1.Models
{
public partial class ExampleProject1DataContext
{
public override void SubmitChanges(ConflictMode failureMode)
{
ManangeAndProcessChangeSet(base.GetChangeSet());
base.SubmitChanges(failureMode);
}
private void ManangeAndProcessChangeSet(ChangeSet changeSet)
{
DateTime now = DateTime.UtcNow;
if (changeSet.Inserts.Count > 0)
{
ProcessInserts(changeSet.Inserts, now);
}
if (changeSet.Updates.Count > 0)
{
ProcessUpdates(changeSet.Updates, now);
}
if (changeSet.Deletes.Count > 0)
{
ProcessDeletes(changeSet.Deletes, now);
}
}
private void ProcessInserts(IList<object> list, DateTime now)
{
IEnumerable<Cake> cakes = list.OfType<Cake>();
IEnumerable<Topping> toppings = list.OfType<Topping>();
// Update the created and modified times.
foreach (Cake cake in cakes)
{
cake.Guid = Guid.NewGuid();
cake.CreatedDateTime = now;
cake.ModifiedDateTime = now;
}
foreach (Topping topping in toppings)
{
topping.Guid = Guid.NewGuid();
topping.CreatedDateTime = now;
topping.ModifiedDateTime = now;
}
}
private void ProcessUpdates(IList<object> list, DateTime now)
{
IEnumerable<Cake> cakes = list.OfType<Cake>();
IEnumerable<Topping> toppings = list.OfType<Topping>();
// Update the created and modified times.
foreach (Cake cake in cakes)
{
ProcessUpdates(cake, now);
}
foreach (Topping topping in toppings)
{
topping.ModifiedDateTime = now;
}
}
private void ProcessDeletes(IList<object> list, DateTime now)
{
IEnumerable<Cake> cakes = list.OfType<Cake>();
IEnumerable<Topping> toppings = list.OfType<Topping>();
// Could create tasks here to delete associated stored files for cakes and toppings.
}
private bool ProcessUpdates(Cake cake, DateTime now)
{
bool modified = false;
ModifiedMemberInfo[] mmi = context.Cakes.GetModifiedMembers(cake);
foreach (ModifiedMemberInfo mi in mmi)
{
switch (mi.Member.Name)
{
case "CountOfItemsSold":
// Exclude from updating the modified date.
break;
case "IsExpired":
if ((bool)mi.CurrentValue)
{
cake.ExpiredDateTime = now;
}
else
{
cake.ExpiredDateTime = null;
}
modified = true;
break;
default:
modified = true;
break;
}
}
if (modified)
{
cake.ModifiedDateTime = now;
}
return modified;
}
}
}
なぜケーキとトッピング?さて、どうしてですか? :-) –