PDA

View Full Version : سوال: خطای ذخیره کردن با Linq



alex_kh58
چهارشنبه 24 مهر 1387, 10:50 صبح
من دوتا جدول دارم که بصورت مستر/دیتیل هستند. کلید اصلی این جداول هم Decimal(18,3) هستش. وقتی میخوام ذخیره کنم پیغام خطای
Cannot add an entity with a key that is already in use
میده و ذخیره نمی کنه.
این با Linq کار کرده ام. موقع اجرای دستور odd.SubmitChanges
خطا میده. درضمن برای ذخیره کردن از sp استفاده میکنم.
کد مورد نظر بهمراه یکی از sp هارو گذاشتم. ممنون میشم اگه کمک کنید.




OrderDataContext odd = new OrderDataContext();
odd.CommandTimeout = 9000;
foDarkhast darkhast = new foDarkhast();

darkhast.CalcDate = "";
darkhast.DarkhastDate = "";
darkhast.DarkhastDs = "";
darkhast.DarkhastFooter = "";
darkhast.DarkhastNo = "";
darkhast.Ds = "";
darkhast.FareeCode = "";
darkhast.FastFormMarjooeNo = "";
darkhast.ForooshStateSN = (byte)1;
darkhast.Hajm = 0;

darkhast.VisitorSN = 182.402M;
darkhast.KanaleForooshSN = 2.402M;
darkhast.NoeDarkhastSN = 1.101M;
darkhast.NoeTahvilSN = 1.101M;
darkhast.NoePardakhtSN = 2.101M;
darkhast.CodeFormSN = 1.101M;
darkhast.ForooshStateSN = 1;

darkhast.Host_Name = "nn";
darkhast.Karton = 0;
darkhast.MoshtariInfoSN = 286.402M;
darkhast.PayeSN = 0;
darkhast.VahedeTejariSN = Convert.ToDecimal(18.935);
darkhast.Vazn = 0;
darkhast.VosoolTime = 0;
odd.foDarkhasts.InsertOnSubmit(darkhast);

var OrderDetails =
from details in odd.osSabads
where details.user == (string)Session["UserInfo"]
select new { details.KalaSN, details.KalaDS, details.Gheymat, details.tedad };

foreach (var detail in OrderDetails)
{
foDarkhastHa darkhastha = new foDarkhastHa();
darkhastha.DarkhastHaVosoolTime = 0;
darkhastha.Tedad = Convert.ToDecimal(detail.tedad);
darkhastha.Ds = "";
darkhastha.FactorSN = null;
darkhastha.FastFormFactorNo = null;
darkhastha.Host_Name = "";
darkhastha.DarkhastTypeSN = 1.101M;
darkhastha.KalaSN = Convert.ToDecimal(detail.KalaSN);
darkhastha.KalaTahvilSN = null ;
darkhastha.RecChksum = 0;
darkhastha.DarkhastHaSN = 0M;
darkhastha.TedadTahvil = 0;
darkhastha.UserID_Name = "nnn";

darkhast.foDarkhastHas.Add(darkhastha);
odd.foDarkhastHas.InsertOnSubmit(darkhastha);

}
odd.SubmitChanges();



CREATE PROCEDURE dbo.foDarkhast_Insert_X
( @DarkhastSN decimal(18,3) OUTPUT,
@DarkhastDs VarChar(500),
@DarkhastNo VarChar(15),
@DarkhastDate VarChar(10),
@MoshtariInfoSN decimal(18,3),
@VisitorSN decimal(18,3),
@NoePardakhtSN decimal(18,3),
@NoeTahvilSN decimal(18,3),
@NoeDarkhastSN decimal(18,3),
@CalcDate VarChar(10),
@VosoolTime int,
@Status tinyint,
@IsFactor Bit,
@Tartib SmallInt,
@PayeSN decimal(18,3),
@VahedeTejariSN decimal(18,3),
@ForooshStateSN tinyint,
@Tozihat VarChar(500),
@Karton decimal(18,3),
@Vazn decimal(18,3),
@Hajm decimal(18,3),
@CodeFormSN decimal(18,3),
@SumFastForm BigInt,
@FastFormMarjooeNo VarChar(500),
.
.
.
.
.
@UserID_Name VarChar(500),
@Host_Name VarChar(500),
@RecChksum int
)

AS



SET @DarkhastSN = ISNULL((SELECT MAX([DarkhastSN]) FROM foDarkhast ),1)
SET @DarkhastSN = @DarkhastSN + 1

INSERT INTO foDarkhast
( [DarkhastSN],
[DarkhastDs],
[DarkhastNo],
[DarkhastDate],
[MoshtariInfoSN],
[VisitorSN],
[NoePardakhtSN],
[NoeTahvilSN],
[NoeDarkhastSN],
[CalcDate],
[VosoolTime],
[Status],
[IsFactor],
[Tartib],
[PayeSN],
[VahedeTejariSN],
.
.
.
.
[UserID_Name],
[Host_Name],
[RecChksum])

VALUES
( @DarkhastSN,
@DarkhastDs,
@DarkhastNo,
@DarkhastDate,
@MoshtariInfoSN,
@VisitorSN,
@NoePardakhtSN,
@NoeTahvilSN,
@NoeDarkhastSN,
@CalcDate,
@VosoolTime,
@Status,
@IsFactor,
@Tartib,
@PayeSN,
@VahedeTejariSN,
@ForooshStateSN,
@Tozihat,
@Karton,
@Vazn,
@Hajm,
@CodeFormSN,
.
.
.
.
.
@UserID_Name,
@Host_Name,
@RecChksum)
GO

Chris_Ronaldo
شنبه 27 مهر 1387, 08:51 صبح
سلام

شما می بایست به صورت دستی به Pk اضافه بکنی.

یعنی توی کد همون جا که داری pk رو generate می کنی همون جا هم عدد یک رو اضافه کن.

موفق باشی

alex_kh58
شنبه 27 مهر 1387, 09:38 صبح
سلام

شما می بایست به صورت دستی به Pk اضافه بکنی.

یعنی توی کد همون جا که داری pk رو generate می کنی همون جا هم عدد یک رو اضافه کن.

موفق باشی

اینو که خودم بهت گفتم.

alex_kh58
شنبه 27 مهر 1387, 09:42 صبح
خود linq امکانی داره که میتونی Max کلید اصلیتو بگیری و به همراه رکورد مورد نظرت ارسال کنی.اینجوری دیگه مشکلم حل شد. شاید روش بهتری هم باشه اما با این کارم راه افتاد.

Chris_Ronaldo
شنبه 27 مهر 1387, 09:45 صبح
خود linq امکانی داره که میتونی Max کلید اصلیتو بگیری و به همراه رکورد مورد نظرت ارسال کنی.اینجوری دیگه مشکلم حل شد. شاید روش بهتری هم باشه اما با این کارم راه افتاد.

منظور من هم دقیقا همین نکته بود.

موفق باشید

alex_kh58
شنبه 27 مهر 1387, 10:19 صبح
منظور من هم دقیقا همین نکته بود.

موفق باشید

کارت واقعا درسته :گیج: