У меня есть проект 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? Любая помощь будет оценена. Большое спасибо!