使用C#MVC4并将DbContext类名与ConnectionString名称匹配以使用正确的数据库?

使用C#MVC4并将DbContext类名与ConnectionString名称匹配以使用正确的数据库?,c#,asp.net-mvc,entity-framework,C#,Asp.net Mvc,Entity Framework,首先使用EF代码,我知道我必须将我的DbContext类名与数据库的连接字符串name属性相匹配,以使它们协同工作。但以下代码不起作用: public class UserDbContext : DbContext { public DbSet<Users> Users { get; set; } } 它按预期工作,我连接到App_数据文件夹中的LocalDB 有人能给我解释一下为什么只有当我将它指向DbContext

首先使用EF代码,我知道我必须将我的DbContext类名与数据库的连接字符串name属性相匹配,以使它们协同工作。但以下代码不起作用:

 public class UserDbContext : DbContext
         {
             public DbSet<Users> Users { get; set; }
         }
它按预期工作,我连接到App_数据文件夹中的LocalDB


有人能给我解释一下为什么只有当我将它指向DbContext类的完整路径时它才起作用吗?

默认构造函数,来自:

使用约定构造一个新的上下文实例来创建名称 要与之建立连接的数据库的。按照惯例 name是派生上下文的全名(命名空间+类名) 班级。有关如何使用此选项创建 连接,请参阅DbContext的备注部分

从DbContext的备注部分:

如果从派生的 上下文,则使用派生上下文的名称查找 app.config或web.config文件中的连接字符串

如果使用反编译器查看
DbContext
中默认构造函数的代码,您将看到它在
DbContext
实例上调用
GetType().ToString()
,并使用该值查找连接字符串。因此,完全可以理解为什么
DbContext
的完全限定类型名是命名连接字符串的有效约定


在您的示例中,
UserDbContext
不是正确的名称,因为它是一个嵌套类。您可以不使用名称空间,但至少必须命名连接字符串
Users+UserDbContext
。如果希望连接字符串单独与类名匹配,则不能将其嵌套在模型中。

在UserDbContext类中指定一个构造函数,这样可以解决问题

        public UserDbContext() : base("UserDbContext") {}

我想这与命名惯例有关。您可以使用与DbContext相同的名称命名连接字符串。尝试将连接名更改为其他名称,我认为这只是巧合,当您添加其工作的全名时。@Derek那么,如果我将连接名更改为FooBar,我们到底希望发生什么?我假设它会像以前一样使用默认连接。除了名称之外,您列出的两个连接字符串是相同的。对,这就是重点。在过去,只要Web.Config中的连接名和dbContext派生的类具有完全相同的名称,一切都是美好的。由于某种原因,在这种情况下情况并非如此。此外,在过去,我的dbContext类无法使用除DefaultConnection之外的任何连接条目,除非名称完全匹配。我在Azure CLoud上设置了一个站点,我回家后会查看这个。
<add name="NextFlicksMVC4.Models.userAccount.Users+UserDbContext"     
 connectionString="Data Source=(LocalDB)\v11.0;
 AttachDbFilename=|DataDirectory|\Users.mdf;
 Integrated Security=True"
 providerName="System.Data.SqlClient" />
        public UserDbContext() : base("UserDbContext") {}