Код Entity Framework сначала не может обновить базу данных после установки внешнего ключа как допускающего значение NULL

У меня возникли проблемы с обновлением моей базы данных с использованием кода EF сначала после того, как я установил внешние ключи (ProcessID и SubProcessID) моей модели как допускающие значение NULL.

Вот модель:

public class MyModel
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public long MyModelID { get; set; }

    [Display(Name = "Process")]
    public int? ProcessID { get; set; }

    [Display(Name = "Sub Process")]
    public int? SubProcessID { get; set; }

    //... some more properties here

    public virtual Process Process { get; set; }
    public virtual SubProcess SubProcess { get; set; }
}

Вот код миграции после добавления миграции:

public override void Up()
{
    DropForeignKey("dbo.MyTable", "ProcessID", "dbo.Process");
    DropForeignKey("dbo.MyTable", "SubProcessID", "dbo.SubProcess");
    DropIndex("dbo.MyTable", new[] { "ProcessID" });
    DropIndex("dbo.MyTable", new[] { "SubProcessID" });
    AlterColumn("dbo.MyTable", "ProcessID", c => c.Int());
    AlterColumn("dbo.MyTable", "SubProcessID", c => c.Int());
    CreateIndex("dbo.MyTable", "ProcessID");
    CreateIndex("dbo.MyTable", "SubProcessID");
    AddForeignKey("dbo.MyTable", "ProcessID", "dbo.Process", "ProcessID");
    AddForeignKey("dbo.MyTable", "SubProcessID", "dbo.SubProcess", "SubProcessID");
}

public override void Down()
{
    DropForeignKey("dbo.MyTable", "SubProcessID", "dbo.SubProcess");
    DropForeignKey("dbo.MyTable", "ProcessID", "dbo.Process");
    DropIndex("dbo.MyTable", new[] { "SubProcessID" });
    DropIndex("dbo.MyTable", new[] { "ProcessID" });
    AlterColumn("dbo.MyTable", "SubProcessID", c => c.Int(nullable: false));
    AlterColumn("dbo.MyTable", "ProcessID", c => c.Int(nullable: false));
    CreateIndex("dbo.MyTable", "SubProcessID");
    CreateIndex("dbo.MyTable", "ProcessID");
    AddForeignKey("dbo.MyTable", "SubProcessID", "dbo.SubProcess", "SubProcessID", cascadeDelete: true);
    AddForeignKey("dbo.MyTable", "ProcessID", "dbo.Process", "ProcessID", cascadeDelete: true);
}

Я получаю следующее сообщение об ошибке:

Table 'MyDatabase.dbo.MyTable' doesn't exist 

Примечание. Мне не удалось обновить базу данных, только когда я установил для этих внешних ключей значение nullable int. Но если я сделаю это как int, я могу успешно обновить базу данных.

Спасибо за вашу помощь!


person jomsk1e    schedule 26.05.2015    source источник
comment
Я не совсем уверен, но в Up, я думаю, AlterColumn("dbo.MyTable", "ProcessID", c => c.Int()); AlterColumn("dbo.MyTable", "SubProcessID", c => c.Int()); должно быть хорошо само по себе. (Кроме того, чтобы ваш Down действительно работал, вам нужно дать своим строкам с нулями в столбце внешнего ключа некоторую ненулевую ссылку)   -  person jjj    schedule 26.05.2015


Ответы (1)


Если у кого-то из вас такая же проблема, как и у меня, вот мое решение моей проблемы:

В папке Migrations> Configuration.cs:

Я изменил конструктор конфигурации на это:

public Configuration()
{
    AutomaticMigrationsEnabled = false;
    SetSqlGenerator("MySql.Data.MySqlClient", new MySql.Data.Entity.MySqlMigrationSqlGenerator());
    CodeGenerator = new MySql.Data.Entity.MySqlMigrationCodeGenerator();
}

И база данных обновлений теперь работает !!

Если у кого-то из вас возникли проблемы с использованием подхода «сначала код» с использованием MySQL, я готов помочь! :)

person jomsk1e    schedule 27.05.2015