EF6 нет данных в таблице «многие ко многим» - PullRequest
0 голосов
/ 02 апреля 2020

Я изучаю ASP. NET MVC и EF с Начало работы с EF 6 с использованием учебника MVC 5 (пример приложения Университета Контозо). Это мой первый вопрос здесь, так что извините, если форма вопроса не идеальна (в любом случае, скажите мне, что не так).

Я придерживался отношения многих ко многим. Таблица создана, но внутри нет данных.

Я добавил свойства виртуальной навигации в оба класса и установил сопоставления в SchoolContext.

Course.cs

 public class Course
    {
        [DatabaseGenerated(DatabaseGeneratedOption.None)]
        [Display(Name = "Numer")]
        public int ID { get; set; }

        [StringLength(50, MinimumLength = 3)]
        [Display(Name = "Przedmiot")]
        public string Title { get; set; }

        [Range(0, 5)]
        [Display(Name = "ECTS")]
        public int Credits { get; set; }

        public int DepartmentID { get; set; }

        public virtual Department Department { get; set; }
        public virtual ICollection<Enrollment> Enrollments { get; set; }
        public virtual ICollection<Instructor> Instructors { get; set; }
    }

Instructor.cs

public class Instructor
    {
        public int ID { get; set; }

        [Required]
        [Display(Name = "Nazwisko")]
        [StringLength(50)]
        public string LastName { get; set; }

        [Required]
        [Column("FirstMidName")]
        [Display(Name = "Imię")]
        [StringLength(50)]
        public string FirstName { get; set; }

        [DataType(DataType.Date)]
        [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
        [Display(Name = "Data zatrudnienia")]
        public DateTime HireDate { get; set; }

        public string FullName 
        { 
            get
            {
                return LastName + " " + FirstName;
            }
        }

        public virtual ICollection<Course> Courses { get; set; }
        public virtual OfficeAssignment OfficeAssignment { get; set; }
    }

SchoolContext.cs

public class SchoolContext : DbContext
    {
        public SchoolContext() : base("SchoolContext")
        {
        }
        public DbSet<Course> Courses { get; set; }
        public DbSet<Department> Departments { get; set; }
        public DbSet<Enrollment> Enrollments { get; set; }
        public DbSet<Instructor> Instructors { get; set; }
        public DbSet<Student> Students { get; set; }
        public DbSet<OfficeAssignment> OfficeAssignments { get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
            modelBuilder.Entity<Course>()
              .HasMany(c => c.Instructors).WithMany(i => i.Courses)
              .Map(t => t.MapLeftKey("CourseID")
                  .MapRightKey("InstructorID")
                  .ToTable("CourseInstructor"));
        }
    } 

Данные инициализируются в Migrations / Configuration.cs в методе Seed ():

protected override void Seed(MyUniversity.DAL.SchoolContext context)
{ (...) 
var instructors = new List<Instructor>
            {
                new Instructor { FirstName = "Antoni", LastName = "Czerwiński", HireDate = DateTime.Parse("2016-07-01")},
                new Instructor { FirstName = "Czesław", LastName = "Piotrowski", HireDate = DateTime.Parse("2016-07-01")},
                new Instructor { FirstName = "Paweł", LastName = "Andrzejewski", HireDate = DateTime.Parse("2016-07-01")},
                new Instructor { FirstName = "Karol", LastName = "Sokołowski", HireDate = DateTime.Parse("2016-07-01")},
                new Instructor { FirstName = "Alojzy", LastName = "Woźniak", HireDate = DateTime.Parse("2016-07-01")}
            };
            instructors.ForEach(s => context.Instructors.AddOrUpdate(p => p.LastName, s));
            context.SaveChanges();

var courses = new List<Course>
            {
                new Course { ID = 1050, Title = "Chemia", Credits =3,
                    DepartmentID = departments.Single(s => s.Name == "Inżynierii").ID, Instructors = new List<Instructor>() },
                new Course { ID = 4022, Title = "Mikroekonomia", Credits =3,
                    DepartmentID = departments.Single(s => s.Name == "Ekonomiczny").ID, Instructors = new List<Instructor>() },
                new Course { ID = 4041, Title = "Makroekonomia", Credits =3,
                    DepartmentID = departments.Single(s => s.Name == "Ekonomiczny").ID, Instructors = new List<Instructor>() },
                new Course { ID = 1045, Title = "Rachunek Różniczkowy", Credits =4,
                    DepartmentID = departments.Single(s => s.Name == "Matematyki").ID, Instructors = new List<Instructor>() },
                new Course { ID = 3141, Title = "Trygonometria", Credits =4,
                    DepartmentID = departments.Single(s => s.Name == "Matematyki").ID, Instructors = new List<Instructor>() },
                new Course { ID = 2021, Title = "Kompozycja", Credits =3,
                    DepartmentID = departments.Single(s => s.Name == "Anglistyki").ID, Instructors = new List<Instructor>() },
                new Course { ID = 2042, Title = "Literatura", Credits =4,
                    DepartmentID = departments.Single(s => s.Name == "Anglistyki").ID, Instructors = new List<Instructor>() }
            };
            courses.ForEach(s => context.Courses.AddOrUpdate(p => p.ID, s));
            context.SaveChanges();  
(...)
}

DbTablesRelationsImage

DbCourseInstructorTableImage

Вот ссылка на проект на моем github, если необходимо: MyGithub

Редактировать (14:15)

У меня есть метод в Семя, которое назначает инструкторов на курсы. Но вопрос в том, почему в таблице до сих пор нет данных?

protected override void Seed(MyUniversity.DAL.SchoolContext context)
{ (...) 
            AddOrUpdateInstructor(context, "Chemia", "Sokołowski");
            AddOrUpdateInstructor(context, "Chemia", "Andrzejewski");
            AddOrUpdateInstructor(context, "Mikroekonomia", "Woźniak");
            AddOrUpdateInstructor(context, "Makroekonomia", "Woźniak");

            AddOrUpdateInstructor(context, "Rachunek Różniczkowy", "Piotrowski");
            AddOrUpdateInstructor(context, "Trygonometria", "Andrzejewski");
            AddOrUpdateInstructor(context, "Kompozycja", "Czerwiński");
            AddOrUpdateInstructor(context, "Literatura", "Czerwiński");

            context.SaveChanges();
}

void AddOrUpdateInstructor(SchoolContext context, string courseTitle, string instructorName)
        {
            var crs = context.Courses.SingleOrDefault(c => c.Title == 
                courseTitle);
            var inst = context.Instructors.SingleOrDefault(i => i.LastName == 
                instructorName);
            if (inst == null)
            {
                crs.Instructors.Add(context.Instructors.Single(i => i.LastName == 
                instructorName));
            }
        }

Ответы [ 2 ]

0 голосов
/ 02 апреля 2020

По умолчанию свойства навигации не загружаются с запросом.

Например:

using ( var context = new SchoolContext () ) {
    var professor = context.Instructors.FirstOrDefault();
    var courses = professor.Courses // this will be null even if there are linked courses.  
}

Чтобы исправить это, вы можете использовать Include ().

Например :

using ( var context = new SchoolContext () ) {
    var professor = context.Instructors
        // this instructs EF to do the Join operation and include the Courses navigation property. 
        .Include ( prof => prof.Courses )   
        .FirstOrDefault();
    var courses = professor.Courses // this will now be populated with courses.  
}
0 голосов
/ 02 апреля 2020

Ни при каких условиях во время посева вы не назначаете инструкторов на курсы; каждому курсу дается пустой список инструкторов. Так что, если этого нет в вашем вопросе, вот почему таблица «многие ко многим» пуста.

...