• 1402/12/08

جدول واسط بین کاربران :

با سلام من توی پروژه 3 نوع یوزر محتلف دارم که برای هر کدوم یه جدول ساختم چون پراپرتی هاشون کاملا مختلف اند. طبق فرمایش خودتون سه تا مدل کردم

 

حالا برای جدول ادرس کدوم راه درستتره ؟

جدول ادرس که سه تا آی دی مدلها رو داشته باشه ؟

Table Address:
ModelId1,
ModelId2,
ModelId3,
AddressId,
.... بقیه پراپرتی ها

یا اینکه بهتره یه جدول واسط داشته باشیم مثلا به نام client 

که با سه تا جدول  model1, model2, model3  رابطه داشته باشه 

آی دی اون جدول کلاینت رو بعد باهاش کار انجام بدیم منظورم اینه هر بار آی دی این کلاینت رو به دست بیاریم ببینم جز کدوم مدله بعد بریم روش عملیات انجام بدیم

دسترسی و اضافه کردن ادرس وووو

  • 1402/12/08
  • ساعت 18:18

سلام. از اونجایی که از یه جدول چند رابطه هست پس باید یک به چند یا چند به چند بشه.


  • 1402/12/08
  • ساعت 18:23

سوالم اینه که بهتره اون جدوا واسط client رو بسازم؟ یا هرتو هر جدولی که نییاز به هر کدم از مدل ها بود آی دی شون رو بذارم تو جدول که بتونم بهشون دسترسی داشته باشم 

کدوم درستتتره؟


  • 1402/12/08
  • ساعت 19:36

کلا سه مدل رابطه هست.

1. تک به تک

2. تک به چند

3. چند به چند.

زمانی که شما از یه جدولی چند تا رابطه نیاز دارید این یعنی رابطه اون جدول میشه گزینه 2 یا 3. بستگی به اون یکی جدول داره که رابطه تک باشه یا چند باشه.


  • 1402/12/08
  • ساعت 19:44

بله استاد اینو می دونم 

سوالم اینه تو شرابطی که سه نوع یوزر داریم 

برای کنترلش و نشوتن متدهای هر کدوم

باید هی جدا جدا صدا شون کنیم پیدا کنیم... یا بهتره یه جدول بسازیم از آی دی های اون سه تا جدول استفاده کنیم؟


  • 1402/12/08
  • ساعت 20:19

اگه من جای شما بودم این طوری انجام میدادم.

1. یه جدول کاربر درست میکردم که اطلاعات مشترک 3 تا کاربر رو داشته باشه مثل ایمیل و نام کاربری و ... .

2. سه تا جدول دیگه درست میکردم برای مواردی که 3 نوع یوزر مختلف دارید و رابطه تک تک به جدول کاربر داشته باشه و ID اون جدول ها null پذیر باشه یعنی رابطه این جدول با اون جداول اختیاریه. از اون جایی که هر کاربر به یکی از این جداول وصل میشه باید null پذیر باشه که بشه بقیه رو خالی گذاشت.

3. نمیدونم اطلاعات سه تا جدول چیه ولی به نظر من اگه امکان داره اونا رو به صورت enum در بیارید و در جدول اصلی استفاده کنید به جای این که چند تا جدول مختلف برای کاربر داشته باشید.

4. بعد از این که کار جدول کاربر تمام شد. میمونه سایر جداول که در صورتی که از یه جدول چند تا رابطه نیازه بهتره که یه جدول واسطی درست بشه که در اون جا اطلاعات خوانده بشه.

5. در صورتی که این چیزی که نوشتم جواب مد نظر شما نیست نمونه کد ارسال کنید تا بهتر بشه راهنمایی کرد


  • 1402/12/09
  • ساعت 14:40

ممنون از توضیحتون 

استاد اطلاعات جدولها کاملا متفاوته برای همین سه تا مدل در نظر گرفته شد

همین کاری که گفتید رو البته کردم یه جدول این وسط گذاشتم به نام client  که یه relatedId  داره و یه relatedType 

که این related type  با اینام کنترل کردم از سه نوع جدول های اون سه مدل اصلی باشند

در واقع توی جدول اینه:

که relatedId  میشه آی دی هر رکوردی که تو اون سه جدول درج میشه 

اگه باشه 2 : میشه دومین سطر از جدول که حالا relatedtype اش اکه 0-1-2 هر کدوم باشه

الان یه کم توی رابطه هاشون گیج شدم

این جدول کلاینت با اون سه جدول رابطه یک به یک داره درسته ؟

رابطه اونا با این کلاینت چه طوی میشه؟

 

و سوال دوم هر یوزری که ثبت میشه پس باید همزمان توی کلاینت هم ثبت بشه؟ و چطوری؟


  • 1402/12/09
  • ساعت 17:53

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

1. یه جدول کلاینت دارید که برای احراز هویت استفاده میشه. یعنی در این جدول فقط نام کاربری، کلمه عبور، ایمیل و موارد مربوط به احراز هویت ذخیره بشه.

2. 3 تا جدول کاربر دارید که بستگی به نوع کاربر اطلاعات حداقل یکی از جداول پر میشه. بنابراین شما 3 تا پراپرتی برای آی دی 3 تا جدول اضافه میکنید. حتما باید null پذیر باشه. این 3 تا جدول باید با جدول کلاینت رابطه یک به یک داشته باشه. چون هر کلاینت فقط یک بار به اطلاعات یکی از اون جداول اضافه میشه.

3. برای آدرس هم یه جدول چداگانه درست کنید. در صورتی که یک بار آدرس ثبت میشه رابطه یک به یک با جدول کلاینت داشته باشه. در صورتی که چند آدرس ثبت میشه رابطه چند (آدرس) به یک (کلاینت) داشته باشه.

4. زمانی که جداول با هم رابطه داشته باشند نیازی به پر کردن چند بار اطلاعات نیست به وسیله همین روابط میشه اطلاعات رو از دیتابیس گرفت.


  • 1402/12/09
  • ساعت 21:40

بنابراین شما 3 تا پراپرتی برای آی دی 3 تا جدول اضافه میکنید

 

این جمله رو نفهمیدم این 3 تا ای دی به کجا اضاقه میشه؟

 

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

خوب پس باید همزمان توی جدول کلاینت هم ثبتش کنیم؟


  • 1402/12/09
  • ساعت 22:34

جدول کلاینت.

طبق چیزی که میبینم جدول اصلی شما کلاینت، پس کاربر ابتدا اونجا ذخیره میشه و در صورتی که در جداول 3 گانه شما اطلاعاتی ذخیره شد آی دی اون در جدول کلاینت ذخیره بشه.


  • 1402/12/09
  • ساعت 22:52

آهان درست متوجه شدم سه تا ای دی هاشو گذاشتم البته اول یه پراپرتی گداشتم به اسم 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
    }
}

 


  • 1402/12/09
  • ساعت 23:17

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

اگه اطلاعات آدرس به صورت مستقیم توسط خود کاربر پر میشه پیشنهاد میشه که آدرس رو در یه جدول ذخیره بشه. و فیلدهای مختلفی برای استان و شهرستان و روستا و خیابان و ... در نظر گرفته بشه و کل موارد در یه جدول ذخیره بشه.

در صورتی که اطلاعات توسط شما پر میشه و کاربر فقط باید انتخاب کنه پیشنهاد میشه جداول استان، شهرستان و روستا به صورت جداگانه ساخته بشه و اطلاعات اون توسط شما پر بشه و بعد توسط کاربر به وسیله select options انتخاب بشه. روابط اون هم استان به شهرستان و روستا یک به چند باشه. البته این کار هم اصولی نیست و هم خیلی زمان میبره مگر این که api چیزی باشه که به راحتی بشه این ها رو پر کرد.

در مورد جداول برای مثال در جدول Corporation من فیلد کلاینت رو میبینم ولی آی دی اون برای رابطه با کلاینت رو نمیبینم. اگه نیست سعی کنید برای تمام روابط تک به تک آی دی اون رو قرار بدید و به وسیله صفت ForeignKey به کلاس مربوطه وصل بشه. پیشنهاد میشه اون سه تا جدول مد نظر شما فقط با جدول کلاینت رابطه داشته باشه نه با یکدیگر. چون بدون کلاینت این جداول معنا نداره (همان طور که اول متن نوشتم جدول کلاینت جدول اصلی شماست)

 


  • 1402/12/09
  • ساعت 23:39

بله استاد دقیقا سه تا جدول با هم‌ رابطه نذاشتم‌فقط هرسه تک به تک با client رابطه یک به یک دارند

 

اما در مورد foreign key 

توی جدول کلاینت مگه نکفتید سه تا ای دی رو‌بذارم که نال پذیر هم باشه گذاشتم

  public int? PersonId { get; set; }

    public int? CorporationId { get; set; }

  public int? ChefId { get; set; }

دیگه برای چی باید توی کلاس corporation  بالای رابطه 

Client client 

فارن‌کی بذاریم؟

 

———

در مورد ادرس متاسفانه هر دو‌حالت رو داریم🙈یکی از مدلها که مشتریه خودش ادرس رو پر میکنه اون تا مدل دیکه ما باید ادر س رو پر کنیم براش 

برای همین حالت دوم رو در نظر گرفتم که البته فقط هر و محله هاست که کفتم با seed data اول پرش کنم تعداد خیلی زیاد نیست

اشتباهه؟

یه دنیا ممنون که وقت می ذارید و‌با حوصله جواب میدید🌺🌺🌺🙏


  • 1402/12/09
  • ساعت 23:52

بله همین طوره سه تا آی دی null پذیر که به معنای اختیاری بودن پر کردن اون هاست.

در مورد رابطه هم حق با شماست. اشتباه از من بود. نباید در هر دو جدول آی دی جداول مربوطه باشه فقط در یکی نیازه. طبق مستندات مایکروسافت. شما باید id رو در کلاس فرزند قرار بدید که برای شما میشه اون سه تا کلاس به خاطر همین فکر کنم رابطه درست به این صورت میشه که شما id کلاینت رو در سه جدول مربوط قرار میدید. و دیگه نیازی به اون 3 تا  id نیست. البته این طوری که من گفتم انجام بدید هم باز درسته مشکلی پیش نمیاد.

https://lern.microsoft.com/en-us/ef/core/modeling/relationships/one-to-one

در مورد آدرس هم اشتباه نیست فقط زمان بره چون دستی باید خیلی چیزها پر بشه همین.


  • 1402/12/09
  • ساعت 23:58

و‌سوال اخر اینکه حالا برای متود اد کردن یوزرها-این سه تا مدل -به دیتا بیس پس باید متود اد رو بنویسیم همزمان دوباره توش اد اون یوزر- مدل به دیتا بیس هم بشه درسته؟ که همزمان توی جفتش اد بشه برای همون استفاده های اینده درسته؟ 

یعنی پراپرتی ها به کانتکس اد بشه 

Corprationid که به دست اومد دوباره تو دلش یه متود اضافه به کلاینت هم بنویسیم اون چیزایی که تکراری از مدل بالاست رو دوباره با یه متد اد دوباره به جدول کلاینت اد کنیم 

درسته؟


  • 1402/12/10
  • ساعت 00:03

تنها چیزی که مهمه اینه که باید id جدول مربوطه در چدولی که رابطه داره ذخیره بشه همین. نیازی نیست در چند تا جدول که با هم رابطه دارن چیزی جداگانه ذخیره بشه. به خاطر همین از روابط استفاده میکنیم که هم اطلاعات کم تری ثبت بشه و هم کار ما در به دست آوردن اطلاعات راحت باشه.


  • 1402/12/10
  • ساعت 00:06

یه  دنیا یه دنیا ممنون از پاسخگوییتون

که انقدر سریع و با حوصله تا این ساعت جواب میدید

واقعا ممنونم

چون‌اینا زیر ساخت بودن میخواستم مطمین باشم از اول درست انجام میشه

بازم واقعا یه دنیا سپاسگذارم🌺🌺🌺


  • 1402/12/10
  • ساعت 00:14

خواهشمندم خوشحالم که مشکلتون حل شده


  • 1402/12/10
  • ساعت 18:34

با سلام مجدد استاد یه راهنمایی می خواستم ازتون 

در ادامه این سوال نوشتم که راحتتر متوجه بشید

طبق فرموده شما اگه سه تا آی دی رو توی جدول بذاریم یه جورایی اکه در آینده مدلی اضافه بشه خوب مشکل میشه دیگه 

میشه یه آی دی گذاشت به اسم 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'.

  • 1402/12/10
  • ساعت 19:09

سلامی دوباره.

به خطار این ارور میده که آی دی یه چیز منحصر به فرده و نباید دو تا جدول آی دی خارجی یکسان داشته باشن. بنابراین جدول person و chefs باید دو تا آی دی خارجی مختلف داشته باشن.


  • 1402/12/10
  • ساعت 19:28

خوب استاد می خوام توی جدول Client  فقط یه ستون RelatedId  داشته باشم اکه پرسن اد شد ----> آی دی ش بیاد تو این

اکه مدلهای دیکه اد شدن آی دی اونا بیاد

الان هم طبق فرمودتون تغییرش دادم فقط میذارمش برای پرسن باز اون اررور رو داره 

خوب الان RelatedId  میخوام هر بار هر مدلی اد شد ای دی اون سطر از همون جدول رو تو خودش ذخیره کنه 

باید چیکار کنم؟


  • 1402/12/10
  • ساعت 19:35

یه کاری انجام بدید. یه پروژه جدید درست کنید. تمام جداول مورد نیاز رو بدون روابط بسازید. بعد اینجا در مورد جداول توضیح بدید و من راهنمایی کنم که چه روابطی باید داشته باشند. چون این طور که من میبینم جداول شما اشکالات زیادی داره و حدس میزنم که حتی اگه این مشکل حل بشه دوباره مشکل جدیدی ایجاد میشه.


  • 1402/12/10
  • ساعت 19:48

چون طولانی میشه تو هر مدل پراپرتی های مهم رو می نویسم. 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  نمیشه


  • 1402/12/10
  • ساعت 20:04

خب اشتباهتون همینجاست شما میخواهید با یه فیلد به سه تا جدول مختلف وصل بشه که امکان پذیر نیست. پس طبق مستندات مایکروسافت جلو میریم. به جای این که 3 تا فیلد در جدول کلاینت داشته باشیم. شما یه فیلد تحت عنوان client id در سه تا جدول مختلف قرار بدید. همین. بهترین راه حل برای شما همینه.


  • 1402/12/10
  • ساعت 20:06

همزمان که نمی خواد وصل بشه 

هر وقت پرسن اد شد آی دی اونو میذاره اینجا

هر وقت شف اد شد ای دی شف رو میذاره .....

و مگه نه اینکه رابطه دارند با هم نمیشه؟

چون با اینام RelatedType هم داره کنترل میشه دیگه معلوم میشه این مثلا پرسن هست حالا آی دی شماره 2 از حدول پرسن میشه مثلا relatedId


  • 1402/12/10
  • ساعت 20:18

خب مشکل همینه یه کلید خارجی فقط و فقط به یه جدول میتونه وصل بشه. به خاطر همین میگم امکان پذیر نیست.

اگه دوست دارید طبق روش خودتون پیش برید. کلاس سه تا جدول رو از کلاینت پاک کنید و سپس به وسیله اون آی دی و نوع RelatedType اطلاعات رو یه بار دیگه از اون جداول بگیرید.


  • 1402/12/10
  • ساعت 20:40

آهان متوحه شدم در مورد فارن کی 

کفتم شاید چون قراره به یکی از سه تا اشاره کنه میشه اینجا برای همشون گذاشت

پس با اینکاری که می گید سه تا جدول رو از توی کلاینت بردارم . مفهموم رابطه یک به یک بودنش چی میشه ؟

فقط توی سه تا جدول بذارم رابطه رو؟

     public Client Clients { get; set; }

و از کلاینت بردارم؟؟


  • 1402/12/10
  • ساعت 20:52

دو حالت داره.

1. شما بخواهید مطابق روش خودتون پیش برید که نیازی به رابطه جداول با کلاینت نیست پس هر رابطه‌ای بین جدول کلاینت با 3 تا جدول هست به طور کامل حذف بشه. فقط کافیه طبق نوع RelatedType از آی مربوطه استفاده کرده و اطلاعات رو از جدول خودش بگیرید.

2. طبق روش من پیش برید که بالاتر توضیح دادم. به طور خلاصه یا 3 تا آی دی null پذیر در جدول کلاینت باشه یا در سه تا جدول مد نظر شما آی دی کلاینت باشه.


  • 1402/12/10
  • ساعت 20:58

آهان درسته الان درست شد ممنون

همون کفتم نمیشه که یه طرف رابطه بمونه ولی یه طرف نمون که : دی

 

بله اون که سه تا آی دی هم بذارم دقیق متوجه شدم اون قابل فهم تر حتی هست برام

ولی کفتم اکه بخوایم بعدا مدلی . جدولی اضاقه بشه یه کم مدیریتش راحتتره 

چون احتمال  خیلی داره که مدل اضافه بشه 

فقط یه چیزی رو نفهمیدم 

مگه تو حالتی که جدول کلاینت داریم و کلا نباید با اون سه تا مدل رابطه داشته باشند ؟ این طوری که حذف کردیم کلا

 

پس جدول آدرس ها هم چی ؟ اونا که باید با سه تا مدل رابطه داشته باشند درسته ؟


  • 1402/12/10
  • ساعت 21:05

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

در مورد آدرس هم نباید رابطه حذف بشه و با هر جدولی رابطه داره روابط اون درست بشه.


  • 1402/12/10
  • ساعت 22:43

ممنون از توضیح کاملتون دقیقا متوجه هر دو حالت شدم 

حالا اکه همون حالت 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
 }

  • 1402/12/10
  • ساعت 22:55

اگه بخواهید مطابق حالت کلاینت پیش برید و هر کدوم از جداول به یکی از جداول سه گانه مربوط بشه بله باید مطابق یکی از دو حالتی که گفتم عمل کنید.

در مورد آدرس هم اگه نیازه با هر سه تا جدول رابطه داشته باشه. آی دی آدرس رو در هر سه جدول قرار بدید تا بتونید اونجا ذخیره کنید.


  • 1402/12/10
  • ساعت 23:16

بله آدرس برای هر سه جدول نیازه 

ولی اینحا هم می حوام همون طور که میبینید locationId گذاشتم برای محله و زیر محله و دوباره 

 

و related id و Related Type  میخوام بذارم که باز بره همون ی که باید رو بخونه و اد کنه 

ولی رابطه شو نمی تونم در بیارم :)

رابطه مدلها و contactInfo  و فارن کی ها رو


  • 1402/12/10
  • ساعت 23:28

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

1. شما ابتدا باید جدول اصلی رو کلاینت در نظر بگیرید نه جدول دیگری رو. چون شما همش به جداول سه گانه اشاره میکنید به خاطر همین این قسمت رو تاکید میکنم که باید جدول کلاینت رو جدول اصلی در نظر بگیرید.

2. در جداول سه گانه شما رابطه یک به یک با جدول کلاینت خواهید داشت بنابراین آی دی جدول کلاینت در جداول سه گانه ذخیره بشه.

3. از این به بعد هر جدول دیگری نیاز بود شما آی دی جدول کلاینت رو در اون جدول قرار بدید نه جدول دیگری رو چون به وسیله کلاینت شما میتونید به جداول سه گانه دسترسی پیدا کنید.

4. در مورد آدرس هم شما 3 تا جدول برای استان، شهرستان و روستا نیاز دارید. و هر چند تا جدول نیازه برای خیابان، بن بست، چندراه، و ... نیازه اضافه کنید. تمام این جداول رابطه یک به چند با جدول استان دارند.

5. و کلا هر جدول دیگری که نیاز بود ساخته بشه و با جداول سه گانه رابطه داشته باشه، رابطه اون رو با جدول کلاینت برقرار کنید نه جدول دیگری رو


  • 1402/12/10
  • ساعت 23:36

نه هر قسمت ادرس قرار نیست یک جدول تبدیل بشه

فقط یه جدول داریم برای آدرس های سه تا مدل - 

منتها به جای اینکه دونه دونه آی دی های مدلها دخیره بشه میخوام RelatedId ش ذخیره بشه 

اون یکی ادرس هم که برای درح شهر استاننن ایناست 

 

اینم جدول شهر و استانه

 

بعد هم تو این قسمت که کفتید:

2. در جداول سه گانه شما رابطه یک به یک با جدول کلاینت خواهید داشت بنابراین آی دی جدول کلاینت در جداول سه گانه ذخیره بشه.

 

ریلیشن ها رو گفتید بردارم دیکه که مشکل حل شد دیگه پس دیگه رابطه ای ندارند که


  • 1402/12/11
  • ساعت 07:09

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

در مورد این که نوع رابطه هم چه طور باشه. باید این طور فکر کنید این دو جدول چه قدر از اطلاعات همدیگه نیاز دارند آیا هر جدول یکباره یا یه جدول تک و اون یکی چندتایی یا هر دو چندتاییه


  • 1402/12/11
  • ساعت 19:10

چشم استاد ممنون  

حالا یه سوال 

این سه تا مدل رابطه فیزیکی که ندارند چون همه چیو دارم توی کلاینت با related Id هم کنترل می کنم

حالا برای ادرس دو تا حدول داریم یکی برای شهر و استان / یکی مناطق

 

الان مثلا میخواهیم سمت ادمین یه کاربری اد کنیم که از هر سه جدول یه جیزاییشو می خوایم 

هم از پرسن / هم از دو تا جدول ادرس: هم شهر/ استان/ هم از جدول دوم ادرس و ....

حالا چطوری باید همه رو گرفت ؟ یه ویو مدل ساختم که فقط موارد احتیاجی رو میگیرم 

حالا هر قسمت جدا باید قسمتی که به هر جدوله با یه متو اد کنم دونه دونه به جدولش؟ 

همه اینا در نهایت باید مثلاتوی متد CreatePerson - مثال _ در نهایت باشه ؟

جدوا آدرس هم related ای کردم یعنی آی دی مربوط به اون پرسن رو فقط توی جدول ادرس می ذارم 

 

 

 

 


  • 1402/12/12
  • ساعت 12:36

شما باید یه جدولی پیدا کنید که با سایر جداول مد نظر شما رابطه مستقیم یا غیر مستقیم داشته باشه. منظور من از رابطه غیر مستقیم به این صورته که مثلا جدول الف با جدول ب رابطه داره و جدول ب با جدول ج رابطه داره و شما به وسیله جدول الف می تونید به جدول ج دسترسی داشته باشید.


  • 1402/12/12
  • ساعت 12:50

تو این خالت که relatedId گذاشتم

یه جورایی رابطه فیزیکی ندارند 

فقط رابطه منطقی دارند

یعنی کد سی شارپی توی مدل نوشته نشده مثلا

Public person person…

رو برداشتم دیگه نتیجه گیری خودتونم پس رابطه هه نوشته نشده ولی چون relatedid ها ثبت میشه رابطه منطقی دارند

اینکه میفزمایید رابطه پیدا کنم منظورتون همین رابطه ست دیگه

دقیقا اون رابطه کد سی شارپی نیست که درسته؟


  • 1402/12/12
  • ساعت 19:17

شما ابتدا یه جدولی که با سایر جداول مد نظر شما همخونی داره رو پیدا کنید. اگه جدولی موند که با روابط نشد. به صورت جداگانه و دستی  پیدا کنید. در صورتی که سوالی مونده صبور باشید سایر کاربران جواب شما رو بدهند.

بنا به دلایلی که در سایت امکان پذیر نیست دیگه قصد پاسخ دادن به سوالات رو نخواهم داشت (تازه دو تا از پاسخام هم در سایر قسمت ها پاک شده)


  • 1402/12/12
  • ساعت 22:02

یه دنیا ممنونم از پاسخگوییتون 

خیلی خیلی محبت کردید و مفید بود