为什么 Code First Migration 将列表 Human 转换为 table Humen?

Why does Code First Migration convert the list Human to table Humen?

注意 不,这是不是错字。看来CF真的要改名了。事实上,我什至 asked about it 在 English Stack Exchange 上,以确保它不是一个意外的变位。

我的上下文如下(包括类的签名)

public class Model : DbContext
{
  public Model() : base("name=Model") { }
  public virtual DbSet<Human> Humans { get; set; }
  public virtual DbSet<Activity> Activities { get; set; }
}
public class Human { ... }
public class Activity { ... }

现在,当我 运行 Add-Migration Init 时,令我最惊讶的是我在 Up() 中得到了这个和 Down().

public override void Up() {
  CreateTable("dbo.Activities", c => ... )
    .PrimaryKey(t => t.Id);
  CreateTable("dbo.Humen", c => ... )
    .PrimaryKey(t => t.Id);
}
public override void Down() {
  DropTable("dbo.Humen");
  DropTable("dbo.Activities");
}

这到底是怎么回事?我与 EF 合作多年,从未见过这样的事情。我搜索了 Humen 的整个解决方案,唯一出现在迁移文件中。

谷歌搜索没有给出任何结果,甚至连对这种事情的小确认都没有但是如果你看this question,我看到那个用户得到了虎门 table 也是。并检查对话 - 他们谈论 Human(s) 并没有真正意识到 table 名字的拼写不同!

现在,我要疯了还是那是什么鸭子?! (故意打字错误。)

要覆盖它,您可以将 TableAnnotation 添加到您的实体,您需要再次 运行 添加迁移,确保覆盖以前的版本...

[Table("Human")]
public class Human { ... }

其他两种替代方法...

一个涉及直接进入生成的迁移并修改方法 Up()Down() 的值...

最后但并非最不重要的是...在您的 DbContext 中使用的 ÈntityTypeConfigurations,只需在您的 DbContext 中覆盖一个名为 OnModelCreating 的受保护方法,并实现此示例...

// HumanConfiguration.cs
public class HumanConfiguration : EntityTypeConfiguration<Human>
{
    public HumanConfiguration()
    {
        this.ToTable("Human");
    }
}

// YourDbContext.cs
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Configurations.Add(new HumanConfiguration());
    base.OnModelCreating(modelBuilder);
}