Миграция данных как часть миграции базы данных
У меня есть проект 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")
}
}
Однако, когда я начинаю копаться, я не вижу способа получить доступ к контексту базы данных внутри миграции. В документации я вижу, что я мог бы реализовать пользовательскую операцию миграции, в которую я мог бы передавать параметры, но для этого все равно требовалась бы способность получать данные в первую очередь... что я не знаю, как это сделать. Кроме того, для довольно стандартных операций потребуется raw sql, что кажется мне странным для ORM.
Может ли кто-нибудь предложить правильный способ переноса данных в ядре ef? Любая помощь будет оценена. Большое спасибо!