C# EF Core:删除迁移中意外创建的列

C# EF Core:删除迁移中意外创建的列,c#,entity-framework-core,migration,C#,Entity Framework Core,Migration,很久以前,我使用EntityFrameworkCore2.1,无意中为1:n关系的导航属性创建了两列。第二列是不需要的,我想删除它。这些列已经被其他人使用,所以我可能不得不使用另一个迁移来摆脱它 代码 这些是具有相关配置的实体类 public class MailReceiver { public long Id { get; set; } public MailTemplate MailTemplate { get; set; } public long? MailT

很久以前,我使用EntityFrameworkCore2.1,无意中为1:n关系的导航属性创建了两列。第二列是不需要的,我想删除它。这些列已经被其他人使用,所以我可能不得不使用另一个迁移来摆脱它

代码 这些是具有相关配置的实体类

public class MailReceiver
{
    public long Id { get; set; }

    public MailTemplate MailTemplate { get; set; }
    public long? MailTemplateId { get; set; }
}
public class MailTemplate
{
    public long Id { get; set; }

    public ICollection<MailReceiver> Receivers { get; set; }
}
//Fluent API
public static void OnModelCreating(ModelBuilder builder)
{
    builder.Entity<MailReceiver>()
        .HasKey(p => p.Id);

    builder.Entity<MailReceiver>()
       .HasOne(f => f.MailTemplate)
       .WithMany()
       .HasForeignKey(t => t.MailTemplateId)
       .OnDelete(DeleteBehavior.Restrict)
       .IsRequired(true);
}
从现在起,我如何摆脱MailTemplateId列并对所有生成的查询使用正确的MailTemplateId列?
奖励:为什么要首先创建第二列?

一个简单的方法来完成您想要的内容,就是在导航栏中添加另一面(“多”面):

builder.Entity()
.HasOne(f=>f.MailTemplate)
.WithMany(t=>t.Receivers)//t.MailTemplateId)
.OnDelete(DeleteBehavior.Restrict)
.IsRequired(正确);
这将导致在添加另一个迁移时生成以下
UP()

protected override void Up(MigrationBuilder MigrationBuilder)
{
migrationBuilder.DropForeignKey(
名称:“FK_MailReceivers_MailTemplates_MailTemplateId1”,
表:“邮件收件人”);
migrationBuilder.DropIndex(
名称:“IX_MailReceivers_MailTemplateId1”,
表:“邮件收件人”);
migrationBuilder.DropColumn(
名称:“MailTemplateId1”,
表:“邮件收件人”);
}
如果不想使用
MailTemplate.Receivers
集合进行导航,则需要将其从模型类中删除或忽略:

builder.Entity()
.忽略(p=>p.Receivers);
否则,EF Core将按约定将其用作导航属性,并将其缺少的外键添加为阴影属性(导致
MailTemplateId1
列)

builder.Entity<MailTemplate>()
         .HasMany(m => m.Receivers)
         .WithOne(m => m.MailTemplate)
         .HasForeignKey(m => m.MailTemplateId);

builder.Entity<MailReceiver>()
        .HasOne(f => f.MailTemplate)
        .WithMany(f => f.Receivers)
        .HasForeignKey(t => t.MailTemplateId)
        .OnDelete(DeleteBehavior.Restrict)
        .IsRequired(true);