如何关闭实体框架 5 的复数表创建?

Posted

技术标签:

【中文标题】如何关闭实体框架 5 的复数表创建?【英文标题】:How turn off pluralize table creation for Entity Framework 5? 【发布时间】:2012-08-21 05:41:49 【问题描述】:

我正在尝试使用 Entity Framework 5。第一个问题是 EF 自动创建表。我试图通过包括 dbModelBuilder.Conventions.Remove<PluralizingTableNameConvention>()。第二个问题是这样的错误

支持“CountryContext”上下文的模型自 数据库已创建。考虑使用 Code First 迁移来更新 数据库。

我尝试通过dbModelBuilder.Conventions.Remove<IncludeMetadataConvention>(); 修复它,但没有任何意义。 接下来是数据访问层:

Table(Name = "tblCountries")]
public class Country

     [Column(Name = "id", IsDbGenerated = true, IsPrimaryKey = true)]
    public int Id get;set;

    [Column(Name = "name")]
    public string Name get;set;


public class CountryContext:DbContext

    public CountryContext(string connStr):base(connStr)
    
    

    public DbSet<Country> TblCountries  get; set; 

    protected override void OnModelCreating(DbModelBuilder dbModelBuilder)
    
        dbModelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
        dbModelBuilder.Conventions.Remove<IncludeMetadataConvention>();
    


    public class CountryDal:BaseDal

   public int CheckIsExist(Country country)
    
        int id = 0;
        using (var context = new CountryContext(ConnectionString))
        
            var first = context.TblCountries.FirstOrDefault(el => el.Name == country.Name);
            if (first != null)
            
                id = first.Id;
            
        
        return id;
    
    

附加信息:VS 2012,框架 4.5,实体框架 5.0.0.0 对于 EF 4,它可以完美运行(没有 OnModelCreating 方法)。

【问题讨论】:

在这里完全猜测,但是当您将实体暗示为 Id 而不是像这样使用全部大写字母时,EF 是否仍将其识别为标识符:ID 【参考方案1】:

如果您不希望 EF 创建表并管理模型和数据库之间的一致性,只需在应用程序启动时使用它:

Database.SetInitializer<CountryContext>(null);

【讨论】:

这将解决问题但不能解决问题 - 但是提问者提出了错误的问题;)【参考方案2】:

您可以在 OnModelCreating 方法中编写此代码:

modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();

【讨论】:

使用 System.Data.Entity.ModelConfiguration.Conventions;【参考方案3】:

在 EF 6.0 中使用 LINQ:

protected override void OnModelCreating(DbModelBuilder modelBuilder)

    base.OnModelCreating(modelBuilder);
    var conventions = new List<PluralizingTableNameConvention>().ToArray();
    modelBuilder.Conventions.Remove(conventions);

【讨论】:

奇怪 - 你删除了一个目标类型的空数组? 请注意 conventions 不是一个空数组,它包含 PluralizingTableNameConvention

以上是关于如何关闭实体框架 5 的复数表创建?的主要内容,如果未能解决你的问题,请参考以下文章

实体框架6在不需要时复数表名

为啥实体框架要复数和大写实体类名?

实体框架 ORM 不创建模型/表 [关闭]

使用相同的模型实体框架С#访问不同的表[关闭]

如何使用实体框架将大量数据延迟加载到 GridView [关闭]

如何让实体框架在不保存对象的情况下创建/更新数据库表