PDA

View Full Version : سوال: استفاده از try &catch در Entity Framework



ciscozagros
یک شنبه 26 مهر 1394, 06:42 صبح
سلام به دوستان عزیز
من یه مشکلی دارم با درج اطلاعات
از try و catch استفاده میکنم اگه در ورود اطلاعات خطا باشه مسیج رو نوشون میده ولی دیگه نمیشه اطلاعات رو دوباره اصلاح کرد باید برنامه رو ببندی دوباره وارد کنیددر هر صورت وقتی دکمه رو میزنی فقط مسیج رو نشون میده

try
{
madrak m = new madrak
{
code_madrak = byte.Parse(code.Text),
madark = maghta.Text,
reshteh = reshte.Text
};
database.madraks.AddObject(m);
database.SaveChanges();
show();
}
catch
{
MessageBox.Show("خطا در ورود اطلاعات");
}

RmeXXXXXXXXX
یک شنبه 26 مهر 1394, 15:26 عصر
سلام.
قبل از اضافه کردن هر شی اونو از لحاظ دارا بودن خطا بررسی کنید. مثلاً شما برای فیلدی حداقل طولی را مشخص کرده اید. قبل از اضافه کردن کردن اونو توسط متد GetValidationResult چک کنید. خروجی این متد یک نوع شمارشی از خطاهایی موجود همراه با نام پروپرتی و توضیح خطا ست. در برنامه های MVC اینکار بصورت خودکار قابل انجام است ولی در winform نه متأسفانه.
من از این روش استفاده میکنم.
ابتدا توی سازنده فرمم به پروپرتی Tag هر کنترل نام پروپرتی متناسب رو میدم. مثلاً برای txtName که مقدار Name رو نگه میداره مینویسم: ; "txtName.Tag="Name . راهکار درست تر در C#‎‎‎‎ 6 استفاده از عملگر nameof هستش که باید یک نمونه از کلاس بسازید و بعد:

var mr=new madrak();
txtName.Tag= nameof( mr.Name );
code.Tag=nameof( mr.code_madrak);



سپس قبل از اضافه کردن رکورد متدی مثل متد زیر رو صدا میزنم.

protected bool Validation(TEntity entity)
{
ClearErrors();
var errors = _unitOfWork.GetValidationResult(entity);
if (errors.IsValid) return true;

foreach (var err in errors.ValidationErrors)
{
SetError(
Controls.Cast<Control>().FirstOrDefault(c => (string) c.Tag == err.PropertyName) ?? saveButton,
err.ErrorMessage);
}
return false;
}

errors.IsValid در صورتی که هیچ خطایی وجود نداشته باشه مقدار true بر می گردونه
و توی حلقه foreach هم دنبال کنترلی میگردم که اسم پروپرتی خطا دار رو (از طریق Tag) پیدا کنه و علامت خطا رو بذاره روش. و در صورتی که خطا مربوط به هیچ کنترلی نباشه، به دکمه save انتصابش میدهد.
متد SetError میتونه مثل زیر پیاده بشه:

protected void SetError(Control cnt, string msg)
{
errorProvider1.SetError(cnt, msg);
}

protected void ClearErrors()
{
errorProvider1.Clear();
}