با سلام من توی پروژه 3 نوع یوزر محتلف دارم که برای هر کدوم یه جدول ساختم چون پراپرتی هاشون کاملا مختلف اند. طبق فرمایش خودتون سه تا مدل کردم
حالا برای جدول ادرس کدوم راه درستتره ؟
جدول ادرس که سه تا آی دی مدلها رو داشته باشه ؟
Table Address:
ModelId1,
ModelId2,
ModelId3,
AddressId,
.... بقیه پراپرتی هایا اینکه بهتره یه جدول واسط داشته باشیم مثلا به نام client
که با سه تا جدول model1, model2, model3 رابطه داشته باشه
آی دی اون جدول کلاینت رو بعد باهاش کار انجام بدیم منظورم اینه هر بار آی دی این کلاینت رو به دست بیاریم ببینم جز کدوم مدله بعد بریم روش عملیات انجام بدیم
دسترسی و اضافه کردن ادرس وووو
سلام. از اونجایی که از یه جدول چند رابطه هست پس باید یک به چند یا چند به چند بشه.
سوالم اینه که بهتره اون جدوا واسط client رو بسازم؟ یا هرتو هر جدولی که نییاز به هر کدم از مدل ها بود آی دی شون رو بذارم تو جدول که بتونم بهشون دسترسی داشته باشم
کدوم درستتتره؟
کلا سه مدل رابطه هست.
1. تک به تک
2. تک به چند
3. چند به چند.
زمانی که شما از یه جدولی چند تا رابطه نیاز دارید این یعنی رابطه اون جدول میشه گزینه 2 یا 3. بستگی به اون یکی جدول داره که رابطه تک باشه یا چند باشه.
بله استاد اینو می دونم
سوالم اینه تو شرابطی که سه نوع یوزر داریم
برای کنترلش و نشوتن متدهای هر کدوم
باید هی جدا جدا صدا شون کنیم پیدا کنیم... یا بهتره یه جدول بسازیم از آی دی های اون سه تا جدول استفاده کنیم؟
اگه من جای شما بودم این طوری انجام میدادم.
1. یه جدول کاربر درست میکردم که اطلاعات مشترک 3 تا کاربر رو داشته باشه مثل ایمیل و نام کاربری و ... .
2. سه تا جدول دیگه درست میکردم برای مواردی که 3 نوع یوزر مختلف دارید و رابطه تک تک به جدول کاربر داشته باشه و ID اون جدول ها null پذیر باشه یعنی رابطه این جدول با اون جداول اختیاریه. از اون جایی که هر کاربر به یکی از این جداول وصل میشه باید null پذیر باشه که بشه بقیه رو خالی گذاشت.
3. نمیدونم اطلاعات سه تا جدول چیه ولی به نظر من اگه امکان داره اونا رو به صورت enum در بیارید و در جدول اصلی استفاده کنید به جای این که چند تا جدول مختلف برای کاربر داشته باشید.
4. بعد از این که کار جدول کاربر تمام شد. میمونه سایر جداول که در صورتی که از یه جدول چند تا رابطه نیازه بهتره که یه جدول واسطی درست بشه که در اون جا اطلاعات خوانده بشه.
5. در صورتی که این چیزی که نوشتم جواب مد نظر شما نیست نمونه کد ارسال کنید تا بهتر بشه راهنمایی کرد
ممنون از توضیحتون
استاد اطلاعات جدولها کاملا متفاوته برای همین سه تا مدل در نظر گرفته شد
همین کاری که گفتید رو البته کردم یه جدول این وسط گذاشتم به نام client که یه relatedId داره و یه relatedType
که این related type با اینام کنترل کردم از سه نوع جدول های اون سه مدل اصلی باشند
در واقع توی جدول اینه:
که relatedId میشه آی دی هر رکوردی که تو اون سه جدول درج میشه
اگه باشه 2 : میشه دومین سطر از جدول که حالا relatedtype اش اکه 0-1-2 هر کدوم باشه
الان یه کم توی رابطه هاشون گیج شدم
این جدول کلاینت با اون سه جدول رابطه یک به یک داره درسته ؟
رابطه اونا با این کلاینت چه طوی میشه؟
و سوال دوم هر یوزری که ثبت میشه پس باید همزمان توی کلاینت هم ثبت بشه؟ و چطوری؟
شما اگه همون چیزهایی رو که در پست قبلی نوشتم رو انجام بدید مشکلتون حل میشه. به طور خلاصه.
1. یه جدول کلاینت دارید که برای احراز هویت استفاده میشه. یعنی در این جدول فقط نام کاربری، کلمه عبور، ایمیل و موارد مربوط به احراز هویت ذخیره بشه.
2. 3 تا جدول کاربر دارید که بستگی به نوع کاربر اطلاعات حداقل یکی از جداول پر میشه. بنابراین شما 3 تا پراپرتی برای آی دی 3 تا جدول اضافه میکنید. حتما باید null پذیر باشه. این 3 تا جدول باید با جدول کلاینت رابطه یک به یک داشته باشه. چون هر کلاینت فقط یک بار به اطلاعات یکی از اون جداول اضافه میشه.
3. برای آدرس هم یه جدول چداگانه درست کنید. در صورتی که یک بار آدرس ثبت میشه رابطه یک به یک با جدول کلاینت داشته باشه. در صورتی که چند آدرس ثبت میشه رابطه چند (آدرس) به یک (کلاینت) داشته باشه.
4. زمانی که جداول با هم رابطه داشته باشند نیازی به پر کردن چند بار اطلاعات نیست به وسیله همین روابط میشه اطلاعات رو از دیتابیس گرفت.
بنابراین شما 3 تا پراپرتی برای آی دی 3 تا جدول اضافه میکنید
این جمله رو نفهمیدم این 3 تا ای دی به کجا اضاقه میشه؟
و اینکه فرض کنیم ما الان داریم یه یوزر دستی اد می کنیم یا ثبت نام می کنه
خوب پس باید همزمان توی جدول کلاینت هم ثبتش کنیم؟
جدول کلاینت.
طبق چیزی که میبینم جدول اصلی شما کلاینت، پس کاربر ابتدا اونجا ذخیره میشه و در صورتی که در جداول 3 گانه شما اطلاعاتی ذخیره شد آی دی اون در جدول کلاینت ذخیره بشه.
آهان درست متوجه شدم سه تا ای دی هاشو گذاشتم البته اول یه پراپرتی گداشتم به اسم relatedId
ولی نمی تونستم پرش کنم : دی _ میشه هم سه تا آی دی گذاشت که شما فرمودید هم یه پراپرتی با توجه به اون چیزی که داره پر میشههمون پر بشه ؟
نه سه تا جدول دیکه جدول اصلی ها هستند
اینو گذاشتم برای کارای احراز هویتی و دسترسی های اینده _ اکه اشتباه نیست
فقط ممنون میشم یه چک کنید ببینید مدلها و رابطه ها درسته یا نه ؟
چون این قسمت پایه هست می خوام ابتداش درست باشه ممنون پیشاپیش
مدلهای اصلی: که اینجا یکیش رو نوشتم این و دو تای دیکه با اطلاعات خودشان: قسمت های اصلی مدل رو نوشتم فقط-
public class Corporation
{
[Key]
public int CorporationId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string CorporationName { get; set; }
.......
#region Relation
public Client Clients { get; set; }
public ICollection<ContactInfo.ContactInfo> ContactInfos { get; set; }
#endregion
}و دو تا مدل دیگه هم به همین ترتیب و رابطه همون طور که گفتید یک به یک و با جدول ادرس یه به چند
و جدول کلاینت :
public class Client
{
[Key]
public int ClientId { get; set; }
public int? PersonId { get; set; }
public int? CorporationId { get; set; }
public int? ChefId { get; set; }
public RelatedType RelatedType { get; set; }
public string Email { get; set; }
public string MobileNumber { get; set; }
public string Password { get; set; }
public int CreatedUser { get; set; }
#region Relations
[ForeignKey("CorporationId")]
public Corporation Corporations { get; set; }
.....
#endregion
}
}
public enum RelatedType
{
...
Corporation=1,
...
}
اینم جدول آدرس برای جزییات آدرس:
public class ContactInfo
{
[Key]
public int ContactInfoId { get; set; }
public int RelatedId { get; set; }
public RelatedType RelatedType { get; set; }
public int ContactInfoCity { get; set; }
public string ContactInfoAddress { get; set; }
.
.
.
#region Relations
....
public Corporation Corporation { get; set; }
.....
public ICollection<ContactInfoCities> ContactInfoCities { get; set; }
#endregion
}
}
و برای ذخیره شهرها یه جدول که با خودش هم رابطه داره:
public class ContactInfoCities
{
[Key]
public int CityId { get; set; }
public int? CityParentId { get; set; }
public string CityName { get; set; }
#region Relations
public ContactInfo ContactInfo { get; set; }
[ForeignKey("ParentId")]
public ContactInfoCities Parent { get; set; }
#endregion
}
}
اول از این که اشتباه میکنید. جدول کلاینت جدول اصلی شماست چون شما به وسیله این جدول احراز هویت میکنید بررسی میکنید که کاربری با این مشخصات هست یا نه. و هم چنین این جدول به سایر جداول شما وصل میشه و باعث گسترش اطلاعات کاربران شما میشه
اگه اطلاعات آدرس به صورت مستقیم توسط خود کاربر پر میشه پیشنهاد میشه که آدرس رو در یه جدول ذخیره بشه. و فیلدهای مختلفی برای استان و شهرستان و روستا و خیابان و ... در نظر گرفته بشه و کل موارد در یه جدول ذخیره بشه.
در صورتی که اطلاعات توسط شما پر میشه و کاربر فقط باید انتخاب کنه پیشنهاد میشه جداول استان، شهرستان و روستا به صورت جداگانه ساخته بشه و اطلاعات اون توسط شما پر بشه و بعد توسط کاربر به وسیله select options انتخاب بشه. روابط اون هم استان به شهرستان و روستا یک به چند باشه. البته این کار هم اصولی نیست و هم خیلی زمان میبره مگر این که api چیزی باشه که به راحتی بشه این ها رو پر کرد.
در مورد جداول برای مثال در جدول Corporation من فیلد کلاینت رو میبینم ولی آی دی اون برای رابطه با کلاینت رو نمیبینم. اگه نیست سعی کنید برای تمام روابط تک به تک آی دی اون رو قرار بدید و به وسیله صفت ForeignKey به کلاس مربوطه وصل بشه. پیشنهاد میشه اون سه تا جدول مد نظر شما فقط با جدول کلاینت رابطه داشته باشه نه با یکدیگر. چون بدون کلاینت این جداول معنا نداره (همان طور که اول متن نوشتم جدول کلاینت جدول اصلی شماست)
بله استاد دقیقا سه تا جدول با هم رابطه نذاشتمفقط هرسه تک به تک با client رابطه یک به یک دارند
اما در مورد foreign key
توی جدول کلاینت مگه نکفتید سه تا ای دی روبذارم که نال پذیر هم باشه گذاشتم
public int? PersonId { get; set; }
public int? CorporationId { get; set; }
public int? ChefId { get; set; }دیگه برای چی باید توی کلاس corporation بالای رابطه
Client client
فارنکی بذاریم؟
———
در مورد ادرس متاسفانه هر دوحالت رو داریم🙈یکی از مدلها که مشتریه خودش ادرس رو پر میکنه اون تا مدل دیکه ما باید ادر س رو پر کنیم براش
برای همین حالت دوم رو در نظر گرفتم که البته فقط هر و محله هاست که کفتم با seed data اول پرش کنم تعداد خیلی زیاد نیست
اشتباهه؟
یه دنیا ممنون که وقت می ذارید وبا حوصله جواب میدید🌺🌺🌺🙏
بله همین طوره سه تا آی دی null پذیر که به معنای اختیاری بودن پر کردن اون هاست.
در مورد رابطه هم حق با شماست. اشتباه از من بود. نباید در هر دو جدول آی دی جداول مربوطه باشه فقط در یکی نیازه. طبق مستندات مایکروسافت. شما باید id رو در کلاس فرزند قرار بدید که برای شما میشه اون سه تا کلاس به خاطر همین فکر کنم رابطه درست به این صورت میشه که شما id کلاینت رو در سه جدول مربوط قرار میدید. و دیگه نیازی به اون 3 تا id نیست. البته این طوری که من گفتم انجام بدید هم باز درسته مشکلی پیش نمیاد.
https://lern.microsoft.com/en-us/ef/core/modeling/relationships/one-to-one
در مورد آدرس هم اشتباه نیست فقط زمان بره چون دستی باید خیلی چیزها پر بشه همین.
وسوال اخر اینکه حالا برای متود اد کردن یوزرها-این سه تا مدل -به دیتا بیس پس باید متود اد رو بنویسیم همزمان دوباره توش اد اون یوزر- مدل به دیتا بیس هم بشه درسته؟ که همزمان توی جفتش اد بشه برای همون استفاده های اینده درسته؟
یعنی پراپرتی ها به کانتکس اد بشه
Corprationid که به دست اومد دوباره تو دلش یه متود اضافه به کلاینت هم بنویسیم اون چیزایی که تکراری از مدل بالاست رو دوباره با یه متد اد دوباره به جدول کلاینت اد کنیم
درسته؟
تنها چیزی که مهمه اینه که باید id جدول مربوطه در چدولی که رابطه داره ذخیره بشه همین. نیازی نیست در چند تا جدول که با هم رابطه دارن چیزی جداگانه ذخیره بشه. به خاطر همین از روابط استفاده میکنیم که هم اطلاعات کم تری ثبت بشه و هم کار ما در به دست آوردن اطلاعات راحت باشه.
یه دنیا یه دنیا ممنون از پاسخگوییتون
که انقدر سریع و با حوصله تا این ساعت جواب میدید
واقعا ممنونم
چوناینا زیر ساخت بودن میخواستم مطمین باشم از اول درست انجام میشه
بازم واقعا یه دنیا سپاسگذارم🌺🌺🌺
خواهشمندم خوشحالم که مشکلتون حل شده
با سلام مجدد استاد یه راهنمایی می خواستم ازتون
در ادامه این سوال نوشتم که راحتتر متوجه بشید
طبق فرموده شما اگه سه تا آی دی رو توی جدول بذاریم یه جورایی اکه در آینده مدلی اضافه بشه خوب مشکل میشه دیگه
میشه یه آی دی گذاشت به اسم RelatedId /
که توش آی هر جدول مرتبط رو ذخیره کنه
من می کنم اینکارو همه ش conflict میده به forigenKey طبق فرموده تون کلاینت با هر سه جدول رابطه یک به یک داره دیکه ریلیشن هاشو گذاشتم ولی فکر میکنم یه ایرادی داره ممنون میشم باز ببنید
مدل 2 و ریلیشنش
.
.
Properties...
#region Relations
public Client Clients { get; set; }
#endregionو مدل کلاینت رو به جای اضافه کردن 3 تا آی دی همون طور که گفتم یه RelatedId گذاشتم و رابطه ش با مدل هم براش هر سه فارن کی نوشتم که توی جدول راحتتر بفهم :
و رابطه ها رو توش این طوری تعریف کردم:
#region Relations
[ForeignKey("RelatedId")]
public Person Persons { get; set; }
[ForeignKey("RelatedId")]
public Chefs Chefs{ get; set; }
#endregion
به نظرم که همه چی درست میاد پس چرا باز کانفلیکت داره اد میکنم پرسن رو میگم که آِی دی مربطه ش هم بذاره تو جدول کلاینت در RelatedId که مشخص بشه مال اینه و مال دو تا مدل دیگه نیست
اینجا چه اتفاقی می افته ؟ این خطا
SqlException: The INSERT statement conflicted with the FOREIGN KEY constraint "FK_Clients_Chefs_RelatedId". The conflict occurred in database "EvSef_db", table "dbo.Chefs", column 'ChefId'.سلامی دوباره.
به خطار این ارور میده که آی دی یه چیز منحصر به فرده و نباید دو تا جدول آی دی خارجی یکسان داشته باشن. بنابراین جدول person و chefs باید دو تا آی دی خارجی مختلف داشته باشن.
خوب استاد می خوام توی جدول Client فقط یه ستون RelatedId داشته باشم اکه پرسن اد شد ----> آی دی ش بیاد تو این
اکه مدلهای دیکه اد شدن آی دی اونا بیاد
الان هم طبق فرمودتون تغییرش دادم فقط میذارمش برای پرسن باز اون اررور رو داره
خوب الان RelatedId میخوام هر بار هر مدلی اد شد ای دی اون سطر از همون جدول رو تو خودش ذخیره کنه
باید چیکار کنم؟
یه کاری انجام بدید. یه پروژه جدید درست کنید. تمام جداول مورد نیاز رو بدون روابط بسازید. بعد اینجا در مورد جداول توضیح بدید و من راهنمایی کنم که چه روابطی باید داشته باشند. چون این طور که من میبینم جداول شما اشکالات زیادی داره و حدس میزنم که حتی اگه این مشکل حل بشه دوباره مشکل جدیدی ایجاد میشه.
چون طولانی میشه تو هر مدل پراپرتی های مهم رو می نویسم. 3 تا مدل داریم با پراپرتی های متفاوت اسم ....که دیکه نمی نویسم طولانی نشه و ای دی خودش که مهمه هر 3 مدل رو نوشتم که همون طوری که فرمودید با کلاینت رابطه یک به یک دارند
مدل 1:
public class Person
{
[Key]
public int PersonId { get; set; }
public string FirstName { get; set; }
.
.
#region Relations
public Client Clients { get; set; }
#endregion
}
مدل 2:
public class Corporation
{
[Key]
public int CorporationId { get; set; }
public string FirstName { get; set; }
.
.
#region Relations
public Client Clients { get; set; }
#endregion
}و مدل 3:
public class Chef
{
[Key]
public int CorporationId { get; set; }
public string FirstName { get; set; }
.
.
#region Relations
public Client Clients { get; set; }
#endregion
}و در آخر جدول client که توش هر سه تا مدل رو توی رابطه اش گذاشتم ولی چون می خوام توی دیتا بیس فقط یه ستون relatedId داشته باشم و هر بار که مثلا پرسن اد شد ، توی clenient هم اد بشه منتها PersonId اون بیاد اینحا بشینه توی RelatedId . آگه Chef اد شد تو جدول خودش حالاChefId بشینه توی ستون RelatedId و همین طور برای جدول سوم.
اینم که جدول کلاینت:
public class Client
{
[Key]
public int ClientId { get; set; }
public int RelatedId { get; set; }
public RelatedType RelatedType { get; set; }
......
پراپرتیهای لازم برای احراز هویت فقط قرار میدیم
#region Relations
[ForeignKey("RelatedId")]
public Person Persons { get; set; }
[ForeignKey("RelatedId")]
public Corporation Corporations { get; set; }
[ForeignKey("RelatedId")]
public Chef Chefs { get; set; }
#endregion
}
public enum RelatedType
{
Person=0,
Corporation=1,
Chef=2,
}
با این کار فقط یوزر به جدول خودش اد میشه و نمی تونم توی Client هم اد کنم...
ولی اگه سه تا آی دی جدایی که شما فرمودید بذارم درست کار میکنه ولی اکه سه تا رو بکنم یه دونه RelatedId نمیشه
خب اشتباهتون همینجاست شما میخواهید با یه فیلد به سه تا جدول مختلف وصل بشه که امکان پذیر نیست. پس طبق مستندات مایکروسافت جلو میریم. به جای این که 3 تا فیلد در جدول کلاینت داشته باشیم. شما یه فیلد تحت عنوان client id در سه تا جدول مختلف قرار بدید. همین. بهترین راه حل برای شما همینه.
همزمان که نمی خواد وصل بشه
هر وقت پرسن اد شد آی دی اونو میذاره اینجا
هر وقت شف اد شد ای دی شف رو میذاره .....
و مگه نه اینکه رابطه دارند با هم نمیشه؟
چون با اینام RelatedType هم داره کنترل میشه دیگه معلوم میشه این مثلا پرسن هست حالا آی دی شماره 2 از حدول پرسن میشه مثلا relatedId
خب مشکل همینه یه کلید خارجی فقط و فقط به یه جدول میتونه وصل بشه. به خاطر همین میگم امکان پذیر نیست.
اگه دوست دارید طبق روش خودتون پیش برید. کلاس سه تا جدول رو از کلاینت پاک کنید و سپس به وسیله اون آی دی و نوع RelatedType اطلاعات رو یه بار دیگه از اون جداول بگیرید.
آهان متوحه شدم در مورد فارن کی
کفتم شاید چون قراره به یکی از سه تا اشاره کنه میشه اینجا برای همشون گذاشت
پس با اینکاری که می گید سه تا جدول رو از توی کلاینت بردارم . مفهموم رابطه یک به یک بودنش چی میشه ؟
فقط توی سه تا جدول بذارم رابطه رو؟
public Client Clients { get; set; }و از کلاینت بردارم؟؟
دو حالت داره.
1. شما بخواهید مطابق روش خودتون پیش برید که نیازی به رابطه جداول با کلاینت نیست پس هر رابطهای بین جدول کلاینت با 3 تا جدول هست به طور کامل حذف بشه. فقط کافیه طبق نوع RelatedType از آی مربوطه استفاده کرده و اطلاعات رو از جدول خودش بگیرید.
2. طبق روش من پیش برید که بالاتر توضیح دادم. به طور خلاصه یا 3 تا آی دی null پذیر در جدول کلاینت باشه یا در سه تا جدول مد نظر شما آی دی کلاینت باشه.
آهان درسته الان درست شد ممنون
همون کفتم نمیشه که یه طرف رابطه بمونه ولی یه طرف نمون که : دی
بله اون که سه تا آی دی هم بذارم دقیق متوجه شدم اون قابل فهم تر حتی هست برام
ولی کفتم اکه بخوایم بعدا مدلی . جدولی اضاقه بشه یه کم مدیریتش راحتتره
چون احتمال خیلی داره که مدل اضافه بشه
فقط یه چیزی رو نفهمیدم
مگه تو حالتی که جدول کلاینت داریم و کلا نباید با اون سه تا مدل رابطه داشته باشند ؟ این طوری که حذف کردیم کلا
پس جدول آدرس ها هم چی ؟ اونا که باید با سه تا مدل رابطه داشته باشند درسته ؟
چون مطابق گفته شما جدول کلاینت فقط و فقط با یکی از جداول سه گانه رابطه داره. به خاطر همین دو تا روش مختلف برای حل مشکل شما نوشتم.
در مورد آدرس هم نباید رابطه حذف بشه و با هر جدولی رابطه داره روابط اون درست بشه.
ممنون از توضیح کاملتون دقیقا متوجه هر دو حالت شدم
حالا اکه همون حالت RelatedId رو بخوایم بریم
پس برای آدرس هم همین طوذ میشه دیکه
ولی از طرفی ما دو تا جدول داریم برای آدرس یکی که شهر ها و محله ها رو ذخیره میکنه کفتم با سید دیتا بزنیم که البته اینحا چون فقط یه شهره - محله و زیر محله ذخیره میشه _ : جدول : ContactLocation
که با خودش رابطه داره و با جدول آدرسهای سه تا یوزر
public class ContactLocation
{
[Key]
public int LocationId { get; set; }
public int? ParentId { get; set; }
[Display(Name = "State Name")]
[Required(ErrorMessage = "{0} is required")]
public string StateName { get; set; }
#region Relations
public ContactInfo ContactInfo { get; set; }
[ForeignKey(" ParentId")]
public ContactLocation Parent { get; set; }
#endregion
}
}و جدولی برای ذخیره آدرسها که گفتید با 3 تا مدل رابطه یه به چند داره درسته ؟مثلا یکی از مدلها:
public class Person
{
[Key]
public int PersonId { get; set; }
.
.
.
#region Relations
public ICollection<ContactInfo.ContactInfo> ContactInfos { get; set; }
#endregion
}
خوب حالا جدولی داریم برای ذخیره آدرس های مشتری به نام ContatcInfo که هر کدوم باید بره تو RelatedId خودش از طرفی هم که نمیشه یه فارن کی به چند تا اشاره کنه
ولی جدول آدرس هم با ید با سه تا مددل در رابطه باشه
پس رابطه شون جطوری میشه ؟
public class ContactInfo
{
[Key]
public int ContactInfoId { get; set; }
public int LocationId { get; set; }
public int RelatedId { get; set; }
public RelatedType RelatedType { get; set; }
public string ContactInfoAddress { get; set; }
.
.
.
#region Relations
[ForeignKey("?????")]
public Person Persons { get; set; }
[ForeignKey("?????")]
public Corporation Corporation { get; set; }
[ForeignKey("?????")]
public Chef Chef { get; set; }
[ForeignKey("LocationId")]
public ICollection<ContactLocation> ContactInfoStates { get; set; }
#endregion
}اگه بخواهید مطابق حالت کلاینت پیش برید و هر کدوم از جداول به یکی از جداول سه گانه مربوط بشه بله باید مطابق یکی از دو حالتی که گفتم عمل کنید.
در مورد آدرس هم اگه نیازه با هر سه تا جدول رابطه داشته باشه. آی دی آدرس رو در هر سه جدول قرار بدید تا بتونید اونجا ذخیره کنید.
بله آدرس برای هر سه جدول نیازه
ولی اینحا هم می حوام همون طور که میبینید locationId گذاشتم برای محله و زیر محله و دوباره
و related id و Related Type میخوام بذارم که باز بره همون ی که باید رو بخونه و اد کنه
ولی رابطه شو نمی تونم در بیارم :)
رابطه مدلها و contactInfo و فارن کی ها رو
روابط جداول رو خیلی پیچیده کردید. اول این که چرا میخواهید هر قسمت آدرس رو به جدول تبدیل کنید؟ این طوری به بینهایت جدول نیازه. شما کلا یه جدول برای آدرس میخواهید که فیلدهای استان، شهرستان و در صورت نیاز روستا رو داشته باشه. بعد کاربر خودش به صورت دستی بقیه آدرس رو بنویسه برای مثلا خیابان الف کوچه ب بن بست پ و الی آخر. این طوری نیازی به جداول بی نهایت نیست. ولی اگه باز اصرار دارید که مطابق روش مد نظر برید. شما باید کار زیر رو انجام بدید.
1. شما ابتدا باید جدول اصلی رو کلاینت در نظر بگیرید نه جدول دیگری رو. چون شما همش به جداول سه گانه اشاره میکنید به خاطر همین این قسمت رو تاکید میکنم که باید جدول کلاینت رو جدول اصلی در نظر بگیرید.
2. در جداول سه گانه شما رابطه یک به یک با جدول کلاینت خواهید داشت بنابراین آی دی جدول کلاینت در جداول سه گانه ذخیره بشه.
3. از این به بعد هر جدول دیگری نیاز بود شما آی دی جدول کلاینت رو در اون جدول قرار بدید نه جدول دیگری رو چون به وسیله کلاینت شما میتونید به جداول سه گانه دسترسی پیدا کنید.
4. در مورد آدرس هم شما 3 تا جدول برای استان، شهرستان و روستا نیاز دارید. و هر چند تا جدول نیازه برای خیابان، بن بست، چندراه، و ... نیازه اضافه کنید. تمام این جداول رابطه یک به چند با جدول استان دارند.
5. و کلا هر جدول دیگری که نیاز بود ساخته بشه و با جداول سه گانه رابطه داشته باشه، رابطه اون رو با جدول کلاینت برقرار کنید نه جدول دیگری رو
نه هر قسمت ادرس قرار نیست یک جدول تبدیل بشه
فقط یه جدول داریم برای آدرس های سه تا مدل -
منتها به جای اینکه دونه دونه آی دی های مدلها دخیره بشه میخوام RelatedId ش ذخیره بشه
اون یکی ادرس هم که برای درح شهر استاننن ایناست
اینم جدول شهر و استانه
بعد هم تو این قسمت که کفتید:
2. در جداول سه گانه شما رابطه یک به یک با جدول کلاینت خواهید داشت بنابراین آی دی جدول کلاینت در جداول سه گانه ذخیره بشه.
ریلیشن ها رو گفتید بردارم دیکه که مشکل حل شد دیگه پس دیگه رابطه ای ندارند که
چون شما همش به روابط سه گانه احتیاج دارید به خاطر همین روش اصولی و درست اون رو براتون نوشتم مطابق چیزی که نوشتم عمل کنید دیگه مشکلی در روابط نخواهید داشت.
در مورد این که نوع رابطه هم چه طور باشه. باید این طور فکر کنید این دو جدول چه قدر از اطلاعات همدیگه نیاز دارند آیا هر جدول یکباره یا یه جدول تک و اون یکی چندتایی یا هر دو چندتاییه
چشم استاد ممنون
حالا یه سوال
این سه تا مدل رابطه فیزیکی که ندارند چون همه چیو دارم توی کلاینت با related Id هم کنترل می کنم
حالا برای ادرس دو تا حدول داریم یکی برای شهر و استان / یکی مناطق
الان مثلا میخواهیم سمت ادمین یه کاربری اد کنیم که از هر سه جدول یه جیزاییشو می خوایم
هم از پرسن / هم از دو تا جدول ادرس: هم شهر/ استان/ هم از جدول دوم ادرس و ....
حالا چطوری باید همه رو گرفت ؟ یه ویو مدل ساختم که فقط موارد احتیاجی رو میگیرم
حالا هر قسمت جدا باید قسمتی که به هر جدوله با یه متو اد کنم دونه دونه به جدولش؟
همه اینا در نهایت باید مثلاتوی متد CreatePerson - مثال _ در نهایت باشه ؟
جدوا آدرس هم related ای کردم یعنی آی دی مربوط به اون پرسن رو فقط توی جدول ادرس می ذارم
شما باید یه جدولی پیدا کنید که با سایر جداول مد نظر شما رابطه مستقیم یا غیر مستقیم داشته باشه. منظور من از رابطه غیر مستقیم به این صورته که مثلا جدول الف با جدول ب رابطه داره و جدول ب با جدول ج رابطه داره و شما به وسیله جدول الف می تونید به جدول ج دسترسی داشته باشید.
تو این خالت که relatedId گذاشتم
یه جورایی رابطه فیزیکی ندارند
فقط رابطه منطقی دارند
یعنی کد سی شارپی توی مدل نوشته نشده مثلا
Public person person…
رو برداشتم دیگه نتیجه گیری خودتونم پس رابطه هه نوشته نشده ولی چون relatedid ها ثبت میشه رابطه منطقی دارند
اینکه میفزمایید رابطه پیدا کنم منظورتون همین رابطه ست دیگه
دقیقا اون رابطه کد سی شارپی نیست که درسته؟
شما ابتدا یه جدولی که با سایر جداول مد نظر شما همخونی داره رو پیدا کنید. اگه جدولی موند که با روابط نشد. به صورت جداگانه و دستی پیدا کنید. در صورتی که سوالی مونده صبور باشید سایر کاربران جواب شما رو بدهند.
بنا به دلایلی که در سایت امکان پذیر نیست دیگه قصد پاسخ دادن به سوالات رو نخواهم داشت (تازه دو تا از پاسخام هم در سایر قسمت ها پاک شده)
یه دنیا ممنونم از پاسخگوییتون
خیلی خیلی محبت کردید و مفید بود