这里我尝试使用代码优先从数据库中获取数据但是如果我有像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
答案 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的解决方案,以禁用整个上下文中的复数约定。