من در winform یک BindingSource دارم و این رو به گرید میدم.
گرید به یک BindingSource بایند شده، اگه مقادیری رو تغییر بدم یا اضافه کنم در گرید (در واقع به BindingSource پشت صحنه) ، ChangeTracker تشخیص میده و میتونم کار رو هندل کنم اما اگه سطری رو از BindingSource (یا همون گرید) حذف کنم ChangeTracker متوجه نمیشه و وضعیتشون Unchanged میمونه! (Local هم فایده نداره) و نمیتونم کل تغییرات رو ذخیره کنم با صدا زدن SaveChanges
در ChangeTracker ایتم هایی با Stateهای Add, Modified رو میتونم ببینم ولی اگه ایتمی رو Delete کنم نمیتونم ببینمش و کاری انجام بدم! مشکل از کجاست؟
اینا مربوط به Context هست برای بررسی وضعیت تغییرات:
public bool HasChanges()
{
return this.ChangeTracker.Entries().Any(e => e.State != EntityState.Unchanged);
}
public void RejectChanges()
{
foreach (var entry in this.ChangeTracker.Entries())
{
switch (entry.State)
{
case EntityState.Modified:
entry.State = EntityState.Unchanged;
break;
case EntityState.Added:
entry.State = EntityState.Detached;
break;
}
}
}
توضیحات بیشتر:
چرا مثل Add , Modify عمل Delete در Entityها و ChangeTracker بصورت خودکار شنیده نمیشه؟! من یک کتابخانهی مستقل تهیه کردم که گرید ،خودش یک کنترل BindingSource داره و اصلا نباید به EntityFramework و سرویسهایی که با Entityها کار میکنن در ارتباط باشه ، BindingSource باید بتونه CurrentItem اش رو Remove کنه در حافظه مثل کاری که برای Add,Update انجام میده و در انتها من (بعنوان کاربر نهایی) در لایه نمایش تصمیم بگیرم که تمام تغییرات انجام شده در گرید (Add, Modify, Delete) رو ذخیره یا لغو کنم.
******* شاید بشه با کمک رویداد BindingSource.ListChanged به نحوی حل کرد ولی اصلا جالب نمیشه چون BindingSource من یک POCO Entity هست و فقط و فقط چنتا property داره و اصلا از وضعیت خودش خبر نداره و قرار هم نیست بیشتر از این باشه و من نمیتونم وضعیتش رو تغییر بدم در این رویداد چون همچین چیزی نداره اصلا!