مرجع تخصصی برنامه نویسان

انجمن تخصصی برنامه نویسان فارسی زبان

کاربر سایت

hamed.producer

عضویت از 1397/01/13

بهرین روش برای ایجاد رابطه چند به چند در EF

  • شنبه 1 اردیبهشت 1397
  • 11:42
تشکر میکنم

سلام دوستان

بنده یک ابهامی در ایجاد رابطه چند به چند با جداول دارم

فرض بفرمایید جدول اول: دانشجو

جدول دوم: درس

(هر درس توسط چندین دانشجو قابل اخذ است و هر دانشجو میتواند چندین درس انتخاب کند)

آیا ما در ایجاد این رابطه صرفا به استفاده از navigation property ها میتوانیم بسنده کنیم؟

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

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

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

پاسخ های این پرسش

تعداد پاسخ ها : 5 پاسخ
کاربر سایت

سهیل علیزاده

عضویت از 1396/04/09

  • شنبه 1 اردیبهشت 1397
  • 11:47

ef به صورت خودکار جدول واسط را ایجاد می کند و نیازی ساختن آن توسط توسعه دهنده نیست. اگر هم به این کار نیاز بود همان طور که خودتان گفتید یک جدول واسط ایجاد کنید و توسط  fluent api رابطه ها را برقرار کنید.

کاربر سایت

hamed.producer

عضویت از 1397/01/13

  • شنبه 1 اردیبهشت 1397
  • 12:33

ممنون از پاسختون اما اگر با fluent api جدول واسط رو ایجاد کنم به آن جدول دسترسی ندارم از طریق کد

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

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

کاربر سایت

سهیل علیزاده

عضویت از 1396/04/09

  • شنبه 1 اردیبهشت 1397
  • 13:40

به صورت زیر عمل کنید:



public class Student
{
    public int Id { get; set; }

    public string Name { get; set; }

    public ICollection<StudentCource> Courses { get; set; }
}

public class Cource
{
    public int Id { get; set; }

    public string Name { get; set; }

    public ICollection<StudentCource> Students { get; set; }
}


public class StudentCource
{
    public int Id { get; set; }

    public Student Student { get; set; }
    public int StudentId { get; set; }

    public Cource Cource { get; set; }
    public int CourceId { get; set; }
}


public class AppDbContext
{
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        modelBuilder.Entity<Student>()
            .HasMany(q => q.Courses)
            .WithRequired(x => x.Student)
            .HasForginKey(x => x.StudentId);

        modelBuilder.Entity<Cource>()
            .HasMany(q => q.Students)
            .WithRequired(x => x.Cource)
            .HasForginKey(x => x.CourceId);
    }
}

کاربر سایت

hamed.producer

عضویت از 1397/01/13

  • شنبه 1 اردیبهشت 1397
  • 15:13

ممنون از پاسخ خوب و کاملتون و آخرین سوال بنده با توجه به کدی که فرستادید

آیا خط کد هایی مثل :     Public Cource Cource {get;set 

آیا باید از نوع virtual باشد یا به همین شکل که شما فرومدید کافیه؟

در صورت نیاز به virtual بودن از شما خواهشمندم ویرایش بفرمایید که برای همه مرجع خوبی باشه

باز هم از مثال عالی و خوبتون سپاسگذارم

کاربر سایت

سهیل علیزاده

عضویت از 1396/04/09

  • شنبه 1 اردیبهشت 1397
  • 16:57

اگر virtual قرار بدید از حالت Lazy Loading استفاده کردید. این مورد دلبخواه است.

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

هیچ کاربری تا کنون از این پست تشکر نکرده است

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

با ما تماس بگیرید تا در این مسیر همراهتان باشیم :)