amir3321
دوشنبه 14 فروردین 1391, 23:56 عصر
با سلام خدمت استادان عزیز
من یک عمل INSERT در entity framework بوسیله یک تابع می خواهم انجام بدهم که در آن ابتدایک جدول با pk با قابلیت identity یک رکورد ثبت می شود وسپس با گرفتن id در جدول دوم یک رکورد دیگر ثبت می شود
مشکل در اینجا این است که هنگام رخ دادن خطا و کنترل آن و بازگشت دوباره به تابع id دو بار عمل increment انجام شده است کد تابع رو اینجا قرار می دهم تا راهنمایی فرمایید .
public static int adduser
(string username, Boolean typeuser, int groupid, string pass, Boolean active
, string fname, string lname, string fax, string email, GNREntities user)
{
using (var transactionScope = new TransactionScope())
{
try
{
// user.SaveChanges(SaveOptions.None);
// addperson(active, fname, lname, fax, email, user);
// addpersonid = user.persons.Max(s => s.id)+1;
addperson(active, fname, lname, fax, email,user);
// persons person = new persons();
// person.fname = fname;
// person.fax = fax;
// person.lname = lname;
// person.email = email;
// person.active = active;
// user.persons.AddObject(person);
// user.SaveChanges();
sysuser user1 = new sysuser();
user1.active = active;
user1.username = username;
user1.groupid = groupid;
user1.pass = pass;
user1.personid = addpersonid;// auser.persons.Max(s => s.id);
user1.typeuser = typeuser;
user.sysusers.AddObject(user1);
user.SaveChanges();
transactionScope.Complete();
user.AcceptAllChanges();
return 0;
}
catch (Exception exp)
{
if (exp.InnerException.Message.Contains("unique") || exp.InnerException.Message.Contains("duplicate"))
{
user = null;
return -1;
}
else
clsmain.except = exp;
return -9;
}
}
}
private void adduser()
{
usersdata = null;
usersdata = new GNREntities();
chkinputdata();
int id;
if (cmbgroup.SelectedValue != null)
id = int.Parse(cmbgroup.SelectedValue.ToString());
else id = 0;
if (newmode)
{
int result = clsbll.adduser(txtusername.Text.ToLower().Trim(), chkadmin.Checked,
id, txtpass1.Text.ToLower().Trim(), chkactive.Checked
, txtfname.Text.ToLower().Trim(), txtlname.Text.ToLower().Trim()
, txtfax.Text.ToLower().Trim(), txtemail.Text.ToLower().Trim(), usersdata);
if(result ==0)
MessageBox.Show("اطلاعات کاربر جدید ثبت گردید");
else if (result == -1)
{
MessageBox.Show("اطلاعات کاربر تکراری می باشد");
datanav1.addoreditmode();
return;
}
else MessageBox.Show("خطا در ثبت اطلاعات" + clsmain.except.ToString());
}
}
آیا روش من صحیح می باشد از SP هم استفاده نمودم باز هم همین مشکل و جود داشت یا در استفاده از INDENTITY این مشکل وجود دارد حتی با استفاده از TRANSACTION ?????
من یک عمل INSERT در entity framework بوسیله یک تابع می خواهم انجام بدهم که در آن ابتدایک جدول با pk با قابلیت identity یک رکورد ثبت می شود وسپس با گرفتن id در جدول دوم یک رکورد دیگر ثبت می شود
مشکل در اینجا این است که هنگام رخ دادن خطا و کنترل آن و بازگشت دوباره به تابع id دو بار عمل increment انجام شده است کد تابع رو اینجا قرار می دهم تا راهنمایی فرمایید .
public static int adduser
(string username, Boolean typeuser, int groupid, string pass, Boolean active
, string fname, string lname, string fax, string email, GNREntities user)
{
using (var transactionScope = new TransactionScope())
{
try
{
// user.SaveChanges(SaveOptions.None);
// addperson(active, fname, lname, fax, email, user);
// addpersonid = user.persons.Max(s => s.id)+1;
addperson(active, fname, lname, fax, email,user);
// persons person = new persons();
// person.fname = fname;
// person.fax = fax;
// person.lname = lname;
// person.email = email;
// person.active = active;
// user.persons.AddObject(person);
// user.SaveChanges();
sysuser user1 = new sysuser();
user1.active = active;
user1.username = username;
user1.groupid = groupid;
user1.pass = pass;
user1.personid = addpersonid;// auser.persons.Max(s => s.id);
user1.typeuser = typeuser;
user.sysusers.AddObject(user1);
user.SaveChanges();
transactionScope.Complete();
user.AcceptAllChanges();
return 0;
}
catch (Exception exp)
{
if (exp.InnerException.Message.Contains("unique") || exp.InnerException.Message.Contains("duplicate"))
{
user = null;
return -1;
}
else
clsmain.except = exp;
return -9;
}
}
}
private void adduser()
{
usersdata = null;
usersdata = new GNREntities();
chkinputdata();
int id;
if (cmbgroup.SelectedValue != null)
id = int.Parse(cmbgroup.SelectedValue.ToString());
else id = 0;
if (newmode)
{
int result = clsbll.adduser(txtusername.Text.ToLower().Trim(), chkadmin.Checked,
id, txtpass1.Text.ToLower().Trim(), chkactive.Checked
, txtfname.Text.ToLower().Trim(), txtlname.Text.ToLower().Trim()
, txtfax.Text.ToLower().Trim(), txtemail.Text.ToLower().Trim(), usersdata);
if(result ==0)
MessageBox.Show("اطلاعات کاربر جدید ثبت گردید");
else if (result == -1)
{
MessageBox.Show("اطلاعات کاربر تکراری می باشد");
datanav1.addoreditmode();
return;
}
else MessageBox.Show("خطا در ثبت اطلاعات" + clsmain.except.ToString());
}
}
آیا روش من صحیح می باشد از SP هم استفاده نمودم باز هم همین مشکل و جود داشت یا در استفاده از INDENTITY این مشکل وجود دارد حتی با استفاده از TRANSACTION ?????