PDA

View Full Version : آموزش: لغو تغییرات در LinqToSql



Vahid_moghaddam
یک شنبه 13 تیر 1389, 14:48 عصر
در LinqToSql بعد از insert، delete و update از دستور SubmitChanges استفاده می شه تا تغییرات در DataBase ذخیره بشه. در این مطلب کدی رو که توی یه مقاله (متاسفانه لینکش رو ندارم) بهش برخوردم قرار می دم. با استفاده از این Method در صورت بروز خطا، تغییرات اعمال شده به دیتابیس Revert می شه.
از این کد هم می شه در لایه BLL و هم در کلاس designer متناظر با مدل دیتابیس استفاده کرد. در حالت دوم تغییر در مدل و دوباره سازی اون باعث از بین رفتن کد می شه و باید دوباره در کلاس کپی بشه.
برای استفاده از این تابع به دو NameSpace زیر نیاز داریم:

using System.Transactions;
using System.Transactions;


فرض کنید db یک نمونه از مدل ما باشه:


private DataClassesDataContext _db = null;
private DataClassesDataContext db
{
get
{
if (_db == null)
_db = new DataClassesDataContext(connectionString);
return _db;
}
}


متد Submit رو به صورت زیر تعریف می کنیم:


private void Submit()
{
using (TransactionScope ts = new TransactionScope())
{
try
{
db.SubmitChanges();
ts.Complete();
}
catch
{

RevertChanges();
}
}

}


و متد RevertChanges به شکل زیره:


void RevertChanges()
{
var cs = db.GetChangeSet();

foreach (var item in cs.Inserts)
{
var t = item.GetType();
db.GetTable(t).DeleteOnSubmit(item);
}

foreach (var item in cs.Deletes)
{
var t = item.GetType();
db.GetTable(t).InsertOnSubmit(item);
}

foreach (var item in cs.Updates)
{
var t = item.GetType();
foreach (var mm in db.GetTable(t).GetModifiedMembers(item))
{
var pi = mm.Member as PropertyInfo;
if (pi != null)
{
pi.SetValue(item, mm.OriginalValue, null);
}

var fi = mm.Member as FieldInfo;
if (fi != null)
{
fi.SetValue(item, mm.OriginalValue);
}
}
}

}


حالا می تونیم از متد Submit برای اعمال تغییرات در DataBase استفاده کنیم.

Mostafa_Dindar
یک شنبه 13 تیر 1389, 15:35 عصر
سلام ,
کاری که کد شما انجام میده با این فرق داره ؟

using (TransactionScope ts = new TransactionScope())
{
try
{
//Your logic
db.Submitchanges();
}
catch (Exception)
{

Transaction.Current.Rollback();
}
}