Entity Framework Code First - 修改表名

39

我想改变使用Entity Framework Code First生成的一个表的名称。

我已经创建了数据库,但现在我想改名。 我已经在项目中更新了对“Metadatas”表的所有引用,将其更改为“Metadata”。 但是在数据库中生成的表仍然是“Metadatas”。 我已经删除并重新创建了数据库,但这似乎也不起作用。 使用TableAttribute也同样无效。 我该怎么办?

谢谢。

[Table("Metadata")]
public class Metadata 
{
    [Required, Key]
    public int MetadataId { get; set; }

    [Required, ScaffoldColumn(false)]
    public int DocumentId { get; set; }

    [Required, StringLength(250), DataType(DataType.Text)]
    public string Title { get; set; }

...


“Table” 应该可以胜任这项工作。确保你正在检查正确的数据库,而不是旧的数据库。这种情况发生在每个人身上。 - Gert Arnold
2个回答

75

你在这里有两个选择:

数据注解:

//Changing database table name to Metadata
[Table("Metadata")]
public class Metadata 
{
  [Required, Key]
  public int MetadataId { get; set; }

  [Required, ScaffoldColumn(false)]
  public int DocumentId { get; set; }

  [Required, StringLength(250), DataType(DataType.Text)]
  public string Title { get; set; 
}

或者我们有流畅的API:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
  //Changing Database table name to Metadata
  modelBuilder.Entity<Metadata>()
      .ToTable("Metadata");
}

如果您想确保您的领域模型保持整洁,那么使用Fluent API是首选方法。

另外,如果您只想删除表名的复数形式,可以使用以下代码覆盖EF的能力:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
}

为什么在数据库中创建的表被称为“Metadatas”,而不是“Metadata”?我认为这就是我感到困惑的原因... - Tums
2
Entity Framework会根据类名的外观来将其复数化,例如如果你有一个叫做“Dog”的类,当多个Dog对象被持久化到数据库中时,你将拥有一个"Dogs"的集合。我能理解你的问题,因为元数据既可以是单数也可以是复数。如果你有一个叫做“Fish”的类(一个名为“Fishs”的表),你将遇到同样的问题。 - Stu1986C
68
我觉得我有点儿糊涂了...我刚刚谷歌搜索了“如何在Entity Framework中重命名数据库表”,找到了这个StackOverflow的问题,并意识到几个月前我就已经回答过它了! :) - Stu1986C
2
这段代码放在DBContext派生类中,供您参考。 - Don Cheadle
1
@Stu1986C,你最后的评论让我笑喷了,不管怎样,这个答案救了我的早上 ;) - Maytham Fahmi
显示剩余4条评论

0
如果您在您的DbContext上有一个DbSet属性,那就是EF可以从中获取表名的地方之一。重命名该属性并运行新的迁移以重命名表格。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接