EF Core 5.0 - 更改 "Defining Query" 映射实体时是否需要生成迁移?
EF Core 5.0 - Do you need to generate a migration when changing a "Defining Query" -mapped entity?
我向我的 EF Core 5.0/MS SQL 服务器数据模型添加了一个实体 class,该模型由定义查询支持(原始 SQL 查询,没有 table 或在我的数据库中查看与之对应的视图)。
当我对其进行更改(例如,添加新列)然后在程序包管理器控制台中 运行 Add-Migration
以创建迁移步骤时,它会生成空 Up(MigrationBuilder migrationBuilder)
和 Down(MigrationBuilder migrationBuilder)
方法。但是生成的 [MigrationName].Designer.cs 文件包含新列,并且我的 DbContext 的 ModelSnapshot 被修改为包含新列,所以 某些东西 已经改变。
我的问题是,每次我对其中一个实体进行更改时是否需要添加迁移才能使我的应用程序正常运行?如果不需要它们,当我更新定义查询支持的实体时,什么被认为是更好的做法:
一个。添加这些迁移,即使它们有空白的 Up(MigrationBuilder migrationBuilder)
和 Down(MigrationBuilder migrationBuilder)
方法,因为模型已更改,或者
乙。不生成迁移,只是在下次有人进行实际影响底层数据库结构的更改时获取这些更改?
代码片段(过度简化以删除识别数据):
实体class
public class Thing
{
public int Id { get; set; }
public string Name { get; set; }
}
实体配置:
public class ThingTypeConfiguration : IEntityTypeConfiguration<Thing>
{
public void Configure(EntityTypeBuilder<Thing> builder)
{
builder
.HasNoKey()
.ToView("Dummy") // This is here to work around an issue with the migrations auto-generating a table for the entity - see https://github.com/dotnet/efcore/issues/19972
.ToSqlQuery(
@"SELECT
[TableName].[IdColumn] AS Id,
[TableName].[OtherColumn] AS Name
FROM
[TableName]");
}
}
数据库上下文:
public class MyDbContext : DbContext
{
public MyDbContext()
{
}
public MyDbContext(DbContextOptions<MyDbContext> options)
: base(options)
{
}
public virtual DbSet<Thing> Things { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
if (!optionsBuilder.IsConfigured)
{
}
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.ApplyConfigurationsFromAssembly(typeof(MyDbContext).Assembly);
}
}
生成的部分迁移示例 classes:
部分 class 具有空 Up/Down 方法:
public partial class MyMigration : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
}
protected override void Down(MigrationBuilder migrationBuilder)
{
}
}
自动生成的__.Designer.cs文件(class的其余部分):
[DbContext(typeof(MyDbContext))]
[Migration("20210302175116_MyMigration")]
partial class MyMigration
{
protected override void BuildTargetModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder
.HasAnnotation("Relational:MaxIdentifierLength", 128)
.HasAnnotation("ProductVersion", "5.0.3")
.HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
/* Entity configuration logic for all the other entities in my model.. */
modelBuilder.Entity("MyDataProject.Thing", b =>
{
b.Property<string>("Id")
.HasColumnType("int");
b.Property<string>("Name")
.HasColumnType("nvarchar(max)");
b.ToView("Dummy");
b
.HasAnnotation("Relational:SqlQuery", "/* My SQL query */");
});
#pragma warning restore 612, 618
}
}
没有。如果数据库架构没有改变,则不需要添加新的迁移。
哎呀,如果新架构与旧架构兼容,您甚至真的 不需要添加新的迁移。例如,删除可选的 属性 仍然是兼容的。
*.Designer 文件仅用于在生成 SQL 时偶尔提供有关模型的附加信息。而且,由于迁移不会生成 SQL,在这种情况下它完全没有被使用。
我向我的 EF Core 5.0/MS SQL 服务器数据模型添加了一个实体 class,该模型由定义查询支持(原始 SQL 查询,没有 table 或在我的数据库中查看与之对应的视图)。
当我对其进行更改(例如,添加新列)然后在程序包管理器控制台中 运行 Add-Migration
以创建迁移步骤时,它会生成空 Up(MigrationBuilder migrationBuilder)
和 Down(MigrationBuilder migrationBuilder)
方法。但是生成的 [MigrationName].Designer.cs 文件包含新列,并且我的 DbContext 的 ModelSnapshot 被修改为包含新列,所以 某些东西 已经改变。
我的问题是,每次我对其中一个实体进行更改时是否需要添加迁移才能使我的应用程序正常运行?如果不需要它们,当我更新定义查询支持的实体时,什么被认为是更好的做法:
一个。添加这些迁移,即使它们有空白的 Up(MigrationBuilder migrationBuilder)
和 Down(MigrationBuilder migrationBuilder)
方法,因为模型已更改,或者
乙。不生成迁移,只是在下次有人进行实际影响底层数据库结构的更改时获取这些更改?
代码片段(过度简化以删除识别数据):
实体class
public class Thing
{
public int Id { get; set; }
public string Name { get; set; }
}
实体配置:
public class ThingTypeConfiguration : IEntityTypeConfiguration<Thing>
{
public void Configure(EntityTypeBuilder<Thing> builder)
{
builder
.HasNoKey()
.ToView("Dummy") // This is here to work around an issue with the migrations auto-generating a table for the entity - see https://github.com/dotnet/efcore/issues/19972
.ToSqlQuery(
@"SELECT
[TableName].[IdColumn] AS Id,
[TableName].[OtherColumn] AS Name
FROM
[TableName]");
}
}
数据库上下文:
public class MyDbContext : DbContext
{
public MyDbContext()
{
}
public MyDbContext(DbContextOptions<MyDbContext> options)
: base(options)
{
}
public virtual DbSet<Thing> Things { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
if (!optionsBuilder.IsConfigured)
{
}
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.ApplyConfigurationsFromAssembly(typeof(MyDbContext).Assembly);
}
}
生成的部分迁移示例 classes:
部分 class 具有空 Up/Down 方法:
public partial class MyMigration : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
}
protected override void Down(MigrationBuilder migrationBuilder)
{
}
}
自动生成的__.Designer.cs文件(class的其余部分):
[DbContext(typeof(MyDbContext))]
[Migration("20210302175116_MyMigration")]
partial class MyMigration
{
protected override void BuildTargetModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder
.HasAnnotation("Relational:MaxIdentifierLength", 128)
.HasAnnotation("ProductVersion", "5.0.3")
.HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
/* Entity configuration logic for all the other entities in my model.. */
modelBuilder.Entity("MyDataProject.Thing", b =>
{
b.Property<string>("Id")
.HasColumnType("int");
b.Property<string>("Name")
.HasColumnType("nvarchar(max)");
b.ToView("Dummy");
b
.HasAnnotation("Relational:SqlQuery", "/* My SQL query */");
});
#pragma warning restore 612, 618
}
}
没有。如果数据库架构没有改变,则不需要添加新的迁移。
哎呀,如果新架构与旧架构兼容,您甚至真的 不需要添加新的迁移。例如,删除可选的 属性 仍然是兼容的。
*.Designer 文件仅用于在生成 SQL 时偶尔提供有关模型的附加信息。而且,由于迁移不会生成 SQL,在这种情况下它完全没有被使用。