Исправлена ​​ошибка дизайна внешнего ключа при переносе - PullRequest
0 голосов
/ 10 февраля 2019

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

public class MyContext : DbContext
{
    public DbSet<MyEntity> MyEntities { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseSqlite("Data Source=database.db");
    }
}

public class MyEntity
{
    public int MyEntityId { get; set; }

    public int MetaEntityId { get; set; }

    public MetaEntity MetaEntity { get; set; }
}

public class MetaEntity
{
    public int MetaEntityId { get; set; }
}

Позже я понял, что это была моя ошибка, и дизайн действительно должен был быть:

public class MyContext : DbContext
{
    public DbSet<MyEntity> MyEntities { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseSqlite("Data Source=database.db");
    }
}

public class MyEntity
{
    public int MyEntityId { get; set; }

    public MetaEntity MetaEntity { get; set; }
}

public class MetaEntity
{
    public int MetaEntityId { get; set; }

    public int MyEntityId { get; set; }

    public MyEntity MyEntity { get; set; }
}

Каков наилучший способ применить эту миграцию без потери отношений между сущностями?Есть ли способ внутри метода Migrations Up (), чтобы запомнить отношения, изменить схему БД и затем повторно применить отношения?

1 Ответ

0 голосов
/ 10 февраля 2019

Хорошо, поэтому я нашел решение (не работает в SQLite !, код выше был просто примером, фактическая производственная база данных - MySQL).

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

migrationBuilder.Sql("UPDATE MetaEntity " +
                             "INNER JOIN MyEntity ON MetaEntity.MetaEntityId = MyEntity.MetaEntityId " +
                             "SET MetaEntity.MyEntityId = MyEntity.MyEntityId;");
...