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

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

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

شنبه, 01 اردیبهشت 1397 11:42

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

سلام دوستان

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

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

جدول دوم: درس

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

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

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

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

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

شنبه, 01 اردیبهشت 1397 11:47

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

شنبه, 01 اردیبهشت 1397 12:33

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

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

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

شنبه, 01 اردیبهشت 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,
شنبه, 01 اردیبهشت 1397 15:13

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

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

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

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

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

شنبه, 01 اردیبهشت 1397 16:57

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

ارسال پاسخ برای این تاپیک