Миграция данных как часть миграции базы данных - PullRequest
0 голосов
/ 14 января 2019

У меня есть проект EFCore, в котором есть существующая таблица с некоторыми данными. Я хотел бы создать новую таблицу, перенести некоторые данные из существующей таблицы, а затем удалить некоторые столбцы из существующей таблицы. Простой пример будет:

Класс пользователя с полями адреса и города:

public class User
{
   long ID {get;set;}
   string UserName {get; set;}
   string Password {get; set;}
   string StreetAddress {get; set;}
   string City {get; set;}
}

И, скажем позже, я хотел разрешить пользователю иметь несколько адресов, чтобы я создал объект Address

public class Address
{
   long ID {get; set;}
   long UserId{get; set;}
   string StreetAddress {get; set;}
   string City {get; set;}   
}

Я бы хотел сгенерировать миграцию, чтобы получить StreetAddress и City от пользователей, а затем создать новую запись адреса, привязанную к этому пользователю. Затем я бы хотел удалить поля StreetAddress и City из User.

В идеале я думал, что смогу сделать это внутри миграции, используя комбинацию методов и запросов MigrationBuilder через мои проекты DatabaseContext .. что-то вроде

public partial class AddressMigration: Migration
{
  protected override void Up(MigrationBuilder migrationBuilder)
  {
    migrationBuilder.CreateTable(
      name "Address",
      columns: table => new
      {
         //table columns
      },
      constraints: table =>
      {
       //constraints   
    });
    List<User> users = myContext.Users.ToList();
    foreach(var user in users)
    {
      var address = new Address() 
      {
        UserId = user.id, 
        StreetAddress = user.StreetAddress, 
        City = user.City
      };
      myContext.Addresses.Add(address);
    }
    myContext.SaveChanges();

    migrationBuilder.DropColumn("StreetAddress", table:"User")
  }
}

Однако когда я начинаю копаться, я не вижу способа получить доступ к контексту базы данных внутри миграции. В документации я вижу, что я мог бы реализовать пользовательскую операцию миграции , в которую я мог бы передавать параметры, но для этого все равно требовалась бы возможность получать данные в первую очередь ... не знаете, как это сделать. Кроме того, для довольно стандартных операций потребуется простой sql, что кажется мне странным для ORM.

Может ли кто-нибудь предложить правильный способ переноса данных в ядре ef? Любая помощь будет оценена. Большое спасибо!

...