C# EF核心:检测表重命名

C# EF核心:检测表重命名,c#,.net-core,ef-core-2.0,C#,.net Core,Ef Core 2.0,我必须通过添加基类来更改实体。 以前,我有过这样的经历: public virtual DbSet<EmailRequest> RefundEmailRequests { get; set; } public virtual DbSet<EmailRequestState> EmailRequestHistory { get; set; } 怎么做?我可以做什么来检测重命名 EmailRequest现在继承自Request 不能将表重命名为现有表。您需要从删除的数据中复

我必须通过添加基类来更改实体。 以前,我有过这样的经历:

public virtual DbSet<EmailRequest> RefundEmailRequests { get; set; }
public virtual DbSet<EmailRequestState> EmailRequestHistory { get; set; }
怎么做?我可以做什么来检测重命名

EmailRequest
现在继承自
Request

不能将表重命名为现有表。您需要从删除的数据中复制数据:

migrationBuilder.Sql(
@"
    INSERT INTO Requests
    SELECT * FROM refunds.EmailRequests;
");

migrationBuilder.DropTable(
    name: "EmailRequests",
    schema: "refunds");

我不是要重新命名为一个现有的。。。我希望“addmigration”efcore命令能够自动执行。很明显,它已经在为一个表而不是另一个表执行此操作,这就是为什么我想知道如果EF可以匹配表名或类名,它将生成一个重命名。否则,您必须重写迁移的这一部分,以使用
RenameTable()
。这个问题可能会有所帮助。如果您坚持让EF对其进行重命名(当您只需编辑迁移时,这似乎很愚蠢),您可以通过两个步骤来完成:1)使用
ToTable()
[Table]
指向新表并生成迁移。2) 重命名该类并删除
ToTable()
[表]
并生成另一个迁移。
private void ConfigureRequest(EntityTypeBuilder<Request> builder)
{
    builder.ToTable("Requests");

    builder.HasKey(s => s.Id);

    builder.HasMany(s => s.History)
        .WithOne()
        .HasForeignKey("RequestId")
        .OnDelete(DeleteBehavior.Cascade);

    builder.HasDiscriminator<string>("Type")
        .HasValue<EmailRequest>(EmailRequest.Type)
        .HasValue<ExternalRequest>(ExternalRequest.Type);

    builder.Ignore(e => e.CurrentState);
}

private void ConfigureRequestState(EntityTypeBuilder<RequestState> builder)
{
    builder.ToTable("RequestStates");

    builder.Property<int>("Id")
        .IsRequired();

    builder.HasKey("Id");

    builder.HasDiscriminator<string>("Type")
        .HasValue<Domain.States.Request.Received>(Domain.States.Request.Received.Type)
        .HasValue<Domain.States.Request.Processing>(Domain.States.Request.Processing.Type)
        .HasValue<Domain.States.Request.Duplicate>(Domain.States.Request.Duplicate.Type)
        .HasValue<Domain.States.Request.Rejected>(Domain.States.Request.Rejected.Type)
        .HasValue<Domain.States.Request.FailedProcessing>(Domain.States.Request.FailedProcessing.Type)
        .HasValue<Domain.States.Request.Processed>(Domain.States.Request.Processed.Type);
}
migrationBuilder.DropTable(
    name: "EmailRequests",
    schema: "refunds");

migrationBuilder.RenameTable(
    name: "EmailRequestStates",
    schema: "refunds",
    newName: "RequestStates");
migrationBuilder.Sql(
@"
    INSERT INTO Requests
    SELECT * FROM refunds.EmailRequests;
");

migrationBuilder.DropTable(
    name: "EmailRequests",
    schema: "refunds");