EF Code First Дополнительная колонка в таблице соединений для целей заказа

У меня есть два объекта, у которых есть отношение, для которого я создаю таблицу соединений

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

    public virtual ICollection<Image> Images { get; set; }
}


public class Image
{
    public int Id { get; set; }
    public string Filename { get; set; }

    public virtual ICollection<Student> Students { get; set; }
}


protected override void OnModelCreating(DbModelBuilder modelBuilder)
{

        modelBuilder.Entity<Student>()
            .HasMany(i => i.Images)
            .WithMany(s => s.Students)
            .Map(m => m.ToTable("StudentImages"));
}

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

Где я должен добавить вставить соответствующий код?

Ответы

Ответ 1

Вы хотите использовать этот новый столбец в своем приложении? В таком случае вы не можете сделать это с вашей моделью. Отношение "многие ко многим" работает только в том случае, если таблица соединений не содержит ничего, кроме внешних ключей к основным таблицам. После добавления дополнительного столбца, открытого для вашего приложения, таблица соединений становится сущностью как любая другая = вам нужен третий класс. Ваша модель должна выглядеть так:

public class StudentImage 
{
    public int StudentId { get; set; }
    public int ImageId { get; set; }
    public int Order { get; set; }
    public virtual Student Student { get; set; }
    public virtual Image Image { get; set; }
}

public class Student
{
    public int Id { get; set; }
    public string Name { get; set; }
    public virtual ICollection<StudentImage> Images { get; set; }
}


public class Image
{
    public int Id { get; set; }
    public string Filename { get; set; }
    public virtual ICollection<StudentImage> Students { get; set; }
}

И ваше отображение также должно измениться:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<StudentImages>().HasKey(si => new { si.StudentId, si.ImageId });

    // The rest should not be needed - it should be done by conventions
    modelBuilder.Entity<Student>()
                .HasMany(s => s.Images)
                .WithRequired(si => si.Student)
                .HasForeignKey(si => si.StudentId); 
    modelBuilder.Entity<Image>()
                .HasMany(s => s.Students)
                .WithRequired(si => si.Image)
                .HasForeignKey(si => si.ImageId); 
}