3

Я использую Entity Framework 6.1.1. Мне нужно добавить дополнительное поле в таблицу соединений, которую я правильно создал с Fluent API. Я знаю, что это невозможно с Fluent API и что мне нужно создать класс модели, но проблема в том, что я не могу отобразить текущую конфигурацию api в классе модели сущности, не заканчивая тем, что отказываюсь от таблицы переходов, создавая его.Добавить дополнительную колонку в существующее отношение многих ко многим - EF Code First

У меня есть два класса моделей: Docente и Lezione.

public class Docente 
{ 
    public int Id { get; set; } 
    public string Nome { get; set; } 
    [Required] 
    public string Cognome { get; set; } 
    public virtual ICollection<Lezione> LezioniDocente { get; set; } 
} 

public class Lezione 
{ 
    public int Id { get; set; } 
    public string Programma { get; set; } 
    public virtual ICollection<Docente> LezioniDocente { get; set; } 
} 

И класс Configuration, который правильно устанавливает таблицу «LezioneDocente»:

public class LezioneConfiguration: EntityTypeConfiguration<Lezione> 
    { 
     public LezioneConfiguration() 
     { 
      ToTable("Lezioni"); 
      Property(c => c.TS).IsRowVersion(); 

      HasMany(d => d.LezioniDocente).WithMany(e => e.LezioniDocente).Map(
      w => w.ToTable("LezioneDocente") 
       .MapLeftKey("LezioneId") 
       .MapRightKey("DocenteId") 
       ); 
     } 

    } 

Теперь у меня есть необходимость добавления дополнительного столбца в этой таблице (RuoloId), так что мне нужно, чтобы отобразить плавная конфигурация API для класса модели. Я пытаюсь сделать это, добавив новый класс модели и модификации Docente и Lezione класс для обозначения новой модели «LezioniDocente», например, так:

public class LezioneDocente 
    { 
     [Key, Column(Order = 0)] 
     public int LezioneId { get; set; } 

     [Key, Column(Order = 1)] 
     public int DocenteId { get; set; } 

     public int RuoloDocenteId { get; set; } 

     public virtual Docente Docente { get; set; } 
     public virtual Lezione Lezione { get; set; } 
     public virtual RuoloDocente RuoloDocente { get; set; } 
    } 

public class Docente 
    { 
     public int Id { get; set; } 
     public string Nome { get; set; } 
     [Required] 
     public string Cognome { get; set; } 
     public virtual ICollection<LezioneDocente> LezioniDocente { get; set; } 

    } 

public class Lezione 
{ 
     public int Id { get; set; } 
     public string Programma { get; set; } 
     public virtual ICollection<LezioneDocente> LezioniDocente { get; set; } 
} 

public class LezioneDocenteConfiguration : EntityTypeConfiguration<LezioneDocente> 
{ 
    public LezioneDocenteConfiguration() 
    { 
     HasRequired(_ => _.Lezione) 
     .WithMany(_ => _.LezioniDocente) 
     .HasForeignKey(_ => _.LezioneId); 

     HasRequired(_ => _.Docente) 
      .WithMany(_ => _.LezioniDocente) 
      .HasForeignKey(_ => _.DocenteId); 

     ToTable("LezioneDocente"); 


    } 
} 

Когда я добавляю новую миграцию, чтобы отразить изменения, которые неизбежно называет DropTable на столе LezioneDocente.

public partial class test : DbMigration 
    { 
     public override void Up() 
     { 
      DropForeignKey("dbo.LezioneDocente", "LezioneId", "dbo.Lezioni"); 
      DropForeignKey("dbo.LezioneDocente", "DocenteId", "dbo.Docenti"); 
      DropIndex("dbo.LezioneDocente", new[] { "LezioneId" }); 
      DropIndex("dbo.LezioneDocente", new[] { "DocenteId" }); 
      CreateTable(
       "dbo.LezioneDocente", 
       c => new 
        { 
         LezioneId = c.Int(nullable: false), 
         DocenteId = c.Int(nullable: false), 
        }) 
       .PrimaryKey(t => new { t.LezioneId, t.DocenteId }) 
       .ForeignKey("dbo.Docenti", t => t.DocenteId, cascadeDelete: true) 
       .ForeignKey("dbo.Lezioni", t => t.LezioneId, cascadeDelete: true) 
       .Index(t => t.DocenteId) 
       .Index(t => t.LezioneId); 

      DropTable("dbo.LezioneDocente"); 
     } 
} 

Я что-то не хватает? Как я могу сопоставить текущую связь API с классом модели, не отбрасывая существующую таблицу? Я также попытался написать класс LezioneDocente, не указав новый столбец, но он все равно прекращает работу с таблицей.

ответ

1

Я не думаю, что вы можете что-либо сделать с помощью свободного API, который расскажет инфраструктуре сущности, что вы хотите сохранить существующую таблицу и таким образом генерировать требуемую миграцию. Но вы можете изменить код в процессе миграции самостоятельно. Просто удалите все созданные капли и создания.

Код миграции, который вы опубликовали, не соответствует вашей модели. Я бы ожидал увидеть столбец RuoloDocenteId в инструкции create table.

В любом случае, это то, что я думаю, что вы хотите в методе Up вместо кода вы публикуемую:

AddColumn("dbo.LezioneDocente", "RuoloDocenteId", c => c.Int(nullable: false)); 
+0

Привет Колин, спасибо за ваш ответ. Да ты прав. Код миграции, о котором я сообщал, состоит в том, что я ссылаюсь на свою попытку написать класс LezioneDocente без добавления дополнительных полей. Я изменил код миграции в соответствии с вашим предложением, и он сработал. Вызывает разочарование, что мы не можем указывать на свободный API для сопоставления с существующей таблицей. – Silvia

 Смежные вопросы

  • Нет связанных вопросов^_^