为什么 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
中使用的 ÈntityTypeConfiguration
s,只需在您的 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);
}
注意 不,这是不是错字。看来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
中使用的 ÈntityTypeConfiguration
s,只需在您的 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);
}