PDA

View Full Version : مشکل در Insert در حالت ارتباط one to many در linq



kanionline
یک شنبه 17 اسفند 1393, 17:50 عصر
با سلام
من تو پروژم ارتباط برای درج اینجوری عمل میکنم
129284

int UID = 0;
tblUserDataContext tbluser = new tblUserDataContext();

tblUser tUser = new tblUser();

tUser.uName = "ali";



tUser.uEmail = "mm@yahoo.com";
tUser.uPhone = "00983333332";
tUser.uDate = "1393/11/15";
tUser.uUserName = "ali123";
tUser.uPassword = "123456";


tbluser.tblUsers.InsertOnSubmit(tUser);
//-------------------------
try
{
tbluser.SubmitChanges(); // only tblUser Change
UID = tUser.uID;
}
catch (Exception e)
{
return e.ToString();

}


tblFamily tFamily = new tblFamily();

tFamily.FK_UID = UID;
tFamily.fName = "reza";
tFamily.fPhone = "00982221122";


tbluser.tblFamily.InsertOnSubmit(tFamily);
try
{
tbluser.SubmitChanges();
}
catch (Exception e)
{
return e.ToString();

}


به درستی دستور insert اجرا میشه ولی وقتی میخوام ارتباط دو جدول رو از one to one به one to many تبدیل کنم و در واقع کلید اصلی tblFamily رو بر میدارم این خطا رو میده، البته کلاس dbml رو هم دوباره پاک میکنم و table ها رو دوباره وارد میکنم باز همین خطا رو دارم.

که ٍپیغام خطا میده

Can't perform Create, Update, or Delete operations on 'Table(tblFamily)' because it has no primary key.

از دوستان اگر میشه راهنمایم کنن ممنون میشم که چطوری ارتباط یک به چند داشته باشم با کد، چون درحالت دستی با خود sql manager درج انجام میشه بدون مشکل.

SabaSabouhi
یک شنبه 17 اسفند 1393, 21:26 عصر
سلام
صورت مساله خیلی بد طرح شده، چون هم طراحی دو جدولش مشکل داره و هم مشکلی که مطرح کردی.
یعنی چی که جدول کاربر و فامیل رو جدا کردی؟
این یعنی چی که FK_UID رو کلید اصلی کردی؟
چرا fID کلید اصلی نیست؟

چیزی که مطرح کردی بیشتر شبیه معما هست تا مشکل نرم‌افزاری.
شما اول بگو چیکار می‌خوای بکنی، منظورت از دو جدولی که مطرح کردی چیه تا من و دیگر دوستان بتونیم کمک کنیم.

اما در کل، اگه فرض کنیم که دلیل منطقی برای وجود این دو جدول وجود داشته باشه
باید تو جدول فامیلی، fID کلید اصلی باشه

صبا صبوحی

kanionline
دوشنبه 18 اسفند 1393, 01:23 صبح
با سلام به دوست عزیزم آقای صبا صبوحی و تشکر بخاطر پاسختون
من جدولی رو که طرح کردم جدول اصلی پروژم نبود و فقط فیلدها رو مثال زدم اصلا مهم نیست فیلدها چی باشن
توی این مثال uID از جدول tblUser کلید اصلی و FK_UID از جدول tblFamily کلید خارجی اون هستند. اگر من FK_UID رو هم Primery key کنم در واقع ارتباط ریلیشنمون یک به یک میشه، در صورتی که من یک ارتباط یک به چند میخوام.
البته من جواب سئوالم رو خودم حل کردم به اینصورت که توی دیاگرام اصلی sql ریلیشن ها رو درست ترسیم میکنیم یعنی یک به یک و یک به چند رو درست طراحی میکنیم، ولی توی کلاس dbml باید حتما ارتباط ها رو با کلید مشخص کرد مثل تصویر اول که هم uID کلید هست و هم FK_UID، فقط از بخش cardinality با یک ارتباط رو one to many کرد. این مشکل حل میشه و دیگه خطا نمیده و داده ها به درستی در بانک ذخیره میشن،
من مشکلم حل شده ولی از نظر منطقی کارم درست نیست، و دلیل اینو نمیدونم.


اما در کل، اگه فرض کنیم که دلیل منطقی برای وجود این دو جدول وجود داشته باشه
باید تو جدول فامیلی، fID کلید اصلی باشه

بله در صورت نیاز باید fID کلید بشه که البته احتیاجی نیست. شما به نام table ها دقت نکنید من فقط یه مثال زدم.

باز ممنون از پاسختون

SabaSabouhi
دوشنبه 18 اسفند 1393, 13:36 عصر
سلام
دوست عزیز، مثل این که کار زیاد داریم.
1. کی گفته که FK_UID باید کلید باشه؟ این خیلی کار اشتباهیه.
2. FID باید حتماً کلید اصلی باشه.
3. در این صورت ارتباط یک به چند خواهد بود.
4. اگه از Database First استفاده می‌کنی حتماً باید همه ارتباط‌ها رو توی دیتابیس مشخص کنی و
بعد EDMX رو بسازی
و مطلقاً تو DataModel تغییری نده.
5. یعنی چی که «در صورت نیاز» باید fId کلید بشه؟ خوب معلومه که باید کلید باشه.

دوست من، طراحی دیتابیس اصولی داره که باید اونا رو بشناسی و رعایت کنی. یه جاهایی هست که می‌تونی به سلیقه‌ی
خودت چیزهایی رو تغییر بدی یا دیتابیس رو از نرمال خارج کنی. اما این دیگه به نظر من غیر قابل قبوله که بجای کلید اصلی،
کلید خارجی رو کلید اصلی کنی و . . .

دو تا پیش‌نهاد دارم:
1. قبل از شروع کار، یه زمانی بگذار و روی طراحی دیتابیس یه مطالعه کوچیک انجام بده. یا این که این قسمت رو
به یه طراح واگذار کن و خودت فقط کد برنامه رو بر اساس دیتابیس طراحی شده انجام بده.
2. اگه کارت رو تازه داری شروع می‌کنی، همه این‌ها رو بگذار کنار و CodeFirst کار کن. حالا که می‌خوای یاد بگیری
به‌تره که از آخرین تکنولوژی‌ها استفاده کنی.

صبا صبوحی

kanionline
دوشنبه 18 اسفند 1393, 16:40 عصر
با سلام مجدد



دوست عزیز، مثل این که کار زیاد داریم.
1. کی گفته که FK_UID باید کلید باشه؟ این خیلی کار اشتباهیه.
2. FID باید حتماً کلید اصلی باشه.
3. در این صورت ارتباط یک به چند خواهد بود.
4. اگه از Database First استفاده می‌کنی حتماً باید همه ارتباط‌ها رو توی دیتابیس مشخص کنی و
بعد EDMX رو بسازی
و مطلقاً تو DataModel تغییری نده.
5. یعنی چی که «در صورت نیاز» باید fId کلید بشه؟ خوب معلومه که باید کلید باشه.

دوست من، طراحی دیتابیس اصولی داره که باید اونا رو بشناسی و رعایت کنی. یه جاهایی هست که می‌تونی به سلیقه‌ی
خودت چیزهایی رو تغییر بدی یا دیتابیس رو از نرمال خارج کنی. اما این دیگه به نظر من غیر قابل قبوله که بجای کلید اصلی،
کلید خارجی رو کلید اصلی کنی و . . .

دو تا پیش‌نهاد دارم:
1. قبل از شروع کار، یه زمانی بگذار و روی طراحی دیتابیس یه مطالعه کوچیک انجام بده. یا این که این قسمت رو
به یه طراح واگذار کن و خودت فقط کد برنامه رو بر اساس دیتابیس طراحی شده انجام بده.
2. اگه کارت رو تازه داری شروع می‌کنی، همه این‌ها رو بگذار کنار و CodeFirst کار کن. حالا که می‌خوای یاد بگیری
به‌تره که از آخرین تکنولوژی‌ها استفاده کنی.

آقای صبوحی خیلی ممنون از راهنمایتون بله کاملا گفته شما درسته و تازه متوجه منظورتون شدم. و پروژه رو کاملا همونطور که فرمودید تغییر دادم و بدون مشکل حل شد.
من مفهوم دیتا بیس رو کامل میدونم ولی چون خیلی وقت بود کار نکرده بودم یادم رفته بود. ولی با گفته های شما یادم اومد.
فقط یه سوال دیگه اینکه رابطه یک به یک به چه شکلی میشه؟!
باز ممنون بابت پیشنهادتون

SabaSabouhi
سه شنبه 19 اسفند 1393, 01:27 صبح
با سلام مجدد

آقای صبوحی خیلی ممنون از راهنمایتون بله کاملا گفته شما درسته و تازه متوجه منظورتون شدم. و پروژه رو کاملا همونطور که فرمودید تغییر دادم و بدون مشکل حل شد.
من مفهوم دیتا بیس رو کامل میدونم ولی چون خیلی وقت بود کار نکرده بودم یادم رفته بود. ولی با گفته های شما یادم اومد.
فقط یه سوال دیگه اینکه رابطه یک به یک به چه شکلی میشه؟!
باز ممنون بابت پیشنهادتون

سلام
چند تا راه می‌تونم بگم، یکیش همون کاریه که اولش انجام داده بودی، که گمان نکنم کاربرد زیادی داشته باشه مگر حالت‌های خاص.
یعنی این که کلید خارجی، کلید اصلی هم باشه.
روش دیگه هم اندیس گذاری هست. شما می‌تونی با گذاشتن اندیس یکتا ( Unique Index ) روی کلید خارجی، رابطه رو یک به یک کنی

صبا صبوحی