在代码中,首先“ies”(复数)是强制性的

时间:2017-04-26 13:32:00

标签: c# ef-code-first

这里我尝试使用代码优先从数据库中获取数据但是如果我有像Country这样的表格,就像这样:

 public class Country
 {
     public int id { get; set; }    
     public string Name { get; set; }
 }  

contextdb

 public class ContextDb: DbContext
 {
     public ContextDb() { }
     public DbSet<Country> Country { get; set; }
     ...
  }

当我实现Countrys时抛出错误:

  

Countries没有dbo

2 个答案:

答案 0 :(得分:2)

请尝试明确指出此特定类型的特定表格

public class ContextDb : DbContext
{
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Country>().ToTable("Country");
    }

    public ContextDb() { }
    public DbSet<Country> Country { get; set; }
}

作为替代方案,您可以关闭复数约定

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

Stefan的回答中提到的另一个选择是在你的模型类上有一个属性(这使得该类“不再是那个POCO-”但在技术上完全有效。)

答案 1 :(得分:1)

通常我们在DbContext中使用复数形式,如下所示:

public DbSet<Country> Countries { get; set; }

EF使用auto plural约定,因此您的实体

 public class Country

将转换为数据库中的数据表[dbo].[Countries]

如果要显式覆盖数据库中表的名称,可以使用以下属性。

[Table("YourNameHere")]
public class Country
{
    public int id { get; set; }
    public string Name { get; set; }
} 

我认为代码中的某个地方存在混淆。

另外,如果您愿意,也可以将表格放在不同的schema中:

[Table("YourNameHere", Schema = "YourSchemaNameHere")]
public class Country
{
    public int id { get; set; }
    public string Name { get; set; }
}

请注意重命名架构,我经历过一些迁移会中断,因为数据库索引名称并不总是正确处理。

注意

请参阅@Wiktor Zychla的解决方案,以禁用整个上下文中的复数约定。