C# EF Core:删除迁移中意外创建的列
很久以前,我使用EntityFrameworkCore2.1,无意中为1:n关系的导航属性创建了两列。第二列是不需要的,我想删除它。这些列已经被其他人使用,所以我可能不得不使用另一个迁移来摆脱它 代码 这些是具有相关配置的实体类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
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);