PDA

View Full Version : مبتدی: استفاده از تراکنش در مدل Database first



winner1
پنج شنبه 01 بهمن 1394, 12:26 عصر
سلام دوستان من از Ef دیابیس فیرست استفاده میکنم از کد زیرم برای تراکنش استفاده مینکم ولی جواب نداد لطفا راهنماییم کنین

public bool Define(Customer reciver, payment payment, Customer sender, ReciveMoney reciveMoney, ReciveMoney pReciveMoney)
{
SqlConnection sc = new SqlConnection(App._ConnectionString);
sc.Open();
using (var trans = sc.BeginTransaction())
{
try
{
if (reciver.TypeOfCustomerId == 3)
{
this.ExchangeDatabase.Customer.Add(reciver);
payment.Customer = reciver;
this.ExchangeDatabase.payment.Add(payment);
}
if (sender.TypeOfCustomerId == 3)
{
this.ExchangeDatabase.Customer.Add(sender);
reciveMoney.Customer = sender;
this.ExchangeDatabase.ReciveMoney.Add(reciveMoney) ;
if (pReciveMoney != null)
{
pReciveMoney.Customer = sender;
this.ExchangeDatabase.ReciveMoney.Add(pReciveMoney );
}
}
this.ExchangeDatabase.SaveChanges();
this.data.SenderId = sender.CustumerId;
this.data.ReciverId = reciver.CustumerId;
this.ExchangeDatabase.Transfer.Add(this.data);
this.ExchangeDatabase.SaveChanges();
trans.Commit();
}
catch
{
trans.Rollback();
return false;
}
finally
{
sc.Close();
}
return true;
}
}

winner1
پنج شنبه 01 بهمن 1394, 18:26 عصر
دوسان لطفا راهنمایی کنین مهمه

Mahmoud.Afrad
پنج شنبه 01 بهمن 1394, 18:51 عصر
این کانکشنی که ساختی هیچ ربطی به شئ Context شما نداره و به تبع هیچ نتیجه ای در بر نخواهد داشت. باید تراکنش رو از شئ context ایجاد کنی. به صورت زیر اصلاح کن. به طریقی بنویس که بتونی تراکنش رو در finally از بین ببری و همچنین return رو به انتهای متد انتقال بده تا finally اجرا بشه.

public bool Define(Customer reciver, payment payment, Customer sender, ReciveMoney reciveMoney, ReciveMoney pReciveMoney)
{
DbContextTransaction transaction = null;
bool flag = false;
try
{
transaction = this.ExchangeDatabase.Database.BeginTransaction();
// ...
this.ExchangeDatabase.SaveChanges();
transaction.Commit();
flag = true;
}
catch
{
if (transaction != null) transaction.Rollback();
}
finally
{
if (transaction != null) transaction.Dispose();
}
return flag;
}

winner1
پنج شنبه 01 بهمن 1394, 18:54 عصر
این کانکشنی که ساختی هیچ ربطی به شئ Context شما نداره و به تبع هیچ نتیجه ای در بر نخواهد داشت. باید تراکنش رو از شئ context ایجاد کنی. به صورت زیر اصلاح کن. به طریقی بنویس که بتونی تراکنش رو در finally از بین ببری و همچنین return رو به انتهای متد انتقال بده تا finally اجرا بشه.

public bool Define(Customer reciver, payment payment, Customer sender, ReciveMoney reciveMoney, ReciveMoney pReciveMoney)
{
DbContextTransaction transaction = null;
bool flag = false;
try
{
transaction = this.ExchangeDatabase.Database.BeginTransaction();
// ...
this.ExchangeDatabase.SaveChanges();
transaction.Commit();
flag = true;
}
catch
{
if (transaction != null) transaction.Rollback();
}
finally
{
if (transaction != null) transaction.Dispose();
}
return flag;
}

مشکل اینه متد BeginTransaction() رو دیتابیس نداره:متفکر::متفکر:
Error 1 'System.Data.Entity.Database' does not contain a definition for 'BeginTransaction' and no extension method 'BeginTransaction' accepting a first argument of type 'System.Data.Entity.Database' could be found (are you missing a using directive or an assembly reference?) E:\Programming\Work\Exchange\Exchange\Class\Managm ent\MTransfer.cs 59 66 Exchange

Mahmoud.Afrad
پنج شنبه 01 بهمن 1394, 20:06 عصر
چون ورژن مدل EF شما پایین بود این خطا رو میده. احتمالا به جای پراپرتی Database از طریق پراپرتی Connection باید اقدام کنی

public bool Define(Customer reciver, payment payment, Customer sender, ReciveMoney reciveMoney, ReciveMoney pReciveMoney)
{
IDbTransaction transaction = null;
bool flag = false;
try
{
this.ExchangeDatabase.Connection.Open();
transaction = this.ExchangeDatabase.Connection.BeginTransaction( );
// ...
this.ExchangeDatabase.SaveChanges();
transaction.Commit();
flag = true;
}
catch
{
if (transaction != null) transaction.Rollback();
}
finally
{
if (transaction != null) transaction.Dispose();
}
return flag;
}

winner1
پنج شنبه 01 بهمن 1394, 20:20 عصر
چون ورژن مدل EF شما پایین بود این خطا رو میده. احتمالا به جای پراپرتی Database از طریق پراپرتی Connection باید اقدام کنی

public bool Define(Customer reciver, payment payment, Customer sender, ReciveMoney reciveMoney, ReciveMoney pReciveMoney)
{
IDbTransaction transaction = null;
bool flag = false;
try
{
this.ExchangeDatabase.Connection.Open();
transaction = this.ExchangeDatabase.Connection.BeginTransaction( );
// ...
this.ExchangeDatabase.SaveChanges();
transaction.Commit();
flag = true;
}
catch
{
if (transaction != null) transaction.Rollback();
}
finally
{
if (transaction != null) transaction.Dispose();
}
return flag;
}

این روشش هم اسفاده کرده بودم که ران تایم داد که sql این ترنس اکشن رو ساپورت نمیکنه

Mahmoud.Afrad
پنج شنبه 01 بهمن 1394, 20:46 عصر
اگر میتونی یک پروژه دیگه ایجاد کن و اگر خطا داد پروژه رو برام بفرست. یک عکس هم از خطا بزار.
دات نت و ef ورژن چند استفاده میکنی؟

ژیار رحیمی
پنج شنبه 01 بهمن 1394, 21:31 عصر
سلام دوست گرامی خود متد SaveChanges کل تغییرات در Contextرو بصورت single transaction در دیتابیس ذخیره میکند .لازم به نوشتن کد اضافه نیست.

winner1
پنج شنبه 01 بهمن 1394, 22:15 عصر
سلام دوست گرامی خود متد SaveChanges کل تغییرات در Contextرو بصورت single transaction در دیتابیس ذخیره میکند .لازم به نوشتن کد اضافه نیست.
کد من رو ببینین نیازه که Customer جدا ثب شه تا از ایدیش استفاده کنم

winner1
پنج شنبه 01 بهمن 1394, 22:16 عصر
اگر میتونی یک پروژه دیگه ایجاد کن و اگر خطا داد پروژه رو برام بفرست. یک عکس هم از خطا بزار.
دات نت و ef ورژن چند استفاده میکنی؟
دات نت 4
vs 2012
138549

ژیار رحیمی
پنج شنبه 01 بهمن 1394, 22:33 عصر
روش کد نویسی به نظر من صحیح نمیباشد.شما از جدول Transfer به جدول Customer ارتباط ارتباط برقرار کردی؟دوست گرامی یه توضیح در مورد تابع نوشته شده بده تا ببینم دقیقا چه عملیاتی رو میخوای ثبت کنی به اضافه ازتباط بین جداول POCO انتی رو در مورد این تابع بزار تا راهنمایی لازم انجام شود

winner1
پنج شنبه 01 بهمن 1394, 22:41 عصر
روش کد نویسی به نظر من صحیح نمیباشد.شما از جدول Transfer به جدول Customer ارتباط ارتباط برقرار کردی؟دوست گرامی یه توضیح در مورد تابع نوشته شده بده تا ببینم دقیقا چه عملیاتی رو میخوای ثبت کنی به اضافه ازتباط بین جداول POCO انتی رو در مورد این تابع بزار تا راهنمایی لازم انجام شود
ما سه نو مشتری داریم که نوع سوم رهگذره که فقط یک بار میاد اگه کاربر اسم جدید وارد کرد باید برنامه یه مشتری همراه با transfer ثبت کنه با نوع سوم بعد ایدیش رو بده به ترنسفر

Mahmoud.Afrad
جمعه 02 بهمن 1394, 00:04 صبح
آقای ژیار رحیمی (http://barnamenevis.org/member.php?48557-%DA%98%DB%8C%D8%A7%D8%B1-%D8%B1%D8%AD%DB%8C%D9%85%DB%8C) درست میگن. اگر ارتباط برقرار کرده باشی نیازی نیست خودت کلیدخارجی رو مقدار بدی. مثل کاری در خط زیر انجام دادی
payment.Customer = reciver;

winner1
جمعه 02 بهمن 1394, 00:24 صبح
آقای ژیار رحیمی (http://barnamenevis.org/member.php?48557-%DA%98%DB%8C%D8%A7%D8%B1-%D8%B1%D8%AD%DB%8C%D9%85%DB%8C) درست میگن. اگر ارتباط برقرار کرده باشی نیازی نیست خودت کلیدخارجی رو مقدار بدی. مثل کاری در خط زیر انجام دادی
payment.Customer = reciver;
اخه ممکنه کاستومر جدید باشه و تو اون لحظه تعریف بشه