为什么我的自定义DbContext在插入时创建了一个表?

时间:2017-04-19 15:13:39

标签: asp.net-mvc entity-framework dbcontext

我正在开发一个ASP MVC项目。

以下是我遵循的步骤:

  • 我在项目参考中添加了实体框架
  • 我连接到我的SQL SERVER数据库,然后使用this answer复制了Web.config中的关联连接字符串。连接成功

  • 我手动创建了自己的DbContex类。以下是其代码:

    public class MyConxtext : DbContext
    {
        public MyConxtext() : base("name = MyConnString"){}
    
        public DbSet<user> user { get; set; }
    }
    

现在用户不仅是SQL服务器中我的表user的名称,而且是我的ASP MVC中我的模型user的名称。

我的问题是: - 当我想通过MyContext.SaveChanges()持久化(会话中的几个项目)时,它在我的数据库中创建了另一个名为users的表...注意这里的复数users ...所以而不是在表user上工作,它创建了另一个名为users的表,并在该表上保留了数据。

我的上下文也无法从user表中读取数据。但正如我所说,处理一切都是连接字符串的架构

我该如何解决这个问题?

它不仅在我的架构中创建了另一个名为MigrationHistory的表,其中包含有关我的项目的数据......

2 个答案:

答案 0 :(得分:1)

您可以在DbContext中覆盖OnModelCreating方法并添加以下行

modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();

这应该删除命名的复数

答案 1 :(得分:0)

实体框架默认情况下会在从提供的实体生成表名时对表名进行复数化。这意味着,如果有一个名为学生的类作为实体对象,并且您声明了 DbSet&lt;您的上下文中的学生<> (继承自 DbContext 的类),默认情况下,EF会以复数形式的实体名称创建表格。这是一个通用的概念,因为该表将包含该实体类型的几行,这意味着它将是实体的集合,在我们的示例中,它将创建一个名为学生的表。

如果要删除此默认约定(System.Data.Entity.ModelConfiguration.Conventions),可以覆盖名为

的方法
  

onModelCreating()

DbContext 类的

在您的代码中,您可以

public class MyConxtext : DbContext
{
    public MyConxtext() : base("name = MyConnString"){}

    public DbSet<user> user { get; set; }




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


 }

这将停止在您的数据库中复制表格的名称,并且它将使用您提到的数据库的用户表。