Entity Framework 数据迁移
Entity Framework Data Migration
我们更改了应用程序中的一些逻辑,现在我们在迁移中添加了一些字段,但现有条目也应该获得一些值。因此我们需要加载条目,计算一些值并需要将这个值添加到新字段中。那么如何访问Sql-Method
请求的数据呢? AddColumn-Method 的 defaultValue-Flag 将不起作用,因为每个条目的计算值都不同。
这里有一些工作流程:
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.AddColumn<uint>(
name: "Field",
table: "Table",
type: "INTEGER",
nullable: false,
defaultValue: 0u);
var builder = migrationBuilder.Sql("SELECT * FROM Table");
var data = builder.AccessData; // here I´m unsure how to access the data
data.Field = Calculator(data);
migrationBuilder.UpdateData(data); // this one is also not cleare
}
A MigrationBuilder
是一种以流畅、C# 友好的方式表达将在迁移过程中执行的 SQL 代码的方法。即使您编写的代码和迁移工具生成的“中间文件”看起来像 C#,最终迁移也变得纯粹 SQL,既不知道也无法与您的应用程序通信。
因此,如果您需要处理现有数据,您的所有逻辑都必须发生 DB-side,并且必须表示为对 MigrationBuilder
的操作。当然,在迁移的 Up
和 Down
方法中,您可以利用 C# 的所有功能来构建要提供给 migrationBuilder.Sql(...)
的原始 SQL 语句。此外,考虑到整个迁移是在事务中执行的,并且“易失性”存储过程可能对提取复杂的迁移逻辑很有用。
我们更改了应用程序中的一些逻辑,现在我们在迁移中添加了一些字段,但现有条目也应该获得一些值。因此我们需要加载条目,计算一些值并需要将这个值添加到新字段中。那么如何访问Sql-Method
请求的数据呢? AddColumn-Method 的 defaultValue-Flag 将不起作用,因为每个条目的计算值都不同。
这里有一些工作流程:
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.AddColumn<uint>(
name: "Field",
table: "Table",
type: "INTEGER",
nullable: false,
defaultValue: 0u);
var builder = migrationBuilder.Sql("SELECT * FROM Table");
var data = builder.AccessData; // here I´m unsure how to access the data
data.Field = Calculator(data);
migrationBuilder.UpdateData(data); // this one is also not cleare
}
A MigrationBuilder
是一种以流畅、C# 友好的方式表达将在迁移过程中执行的 SQL 代码的方法。即使您编写的代码和迁移工具生成的“中间文件”看起来像 C#,最终迁移也变得纯粹 SQL,既不知道也无法与您的应用程序通信。
因此,如果您需要处理现有数据,您的所有逻辑都必须发生 DB-side,并且必须表示为对 MigrationBuilder
的操作。当然,在迁移的 Up
和 Down
方法中,您可以利用 C# 的所有功能来构建要提供给 migrationBuilder.Sql(...)
的原始 SQL 语句。此外,考虑到整个迁移是在事务中执行的,并且“易失性”存储过程可能对提取复杂的迁移逻辑很有用。