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

时间:2013-01-08 16:40:45

标签: c# asp.net-mvc entity-framework

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

 public class UserDbContext : DbContext
         {
             public DbSet<Users> Users { get; set; }
         }

以及此连接字符串:

<add name="UserDbContext" 
 connectionString="Data Source=(LocalDB)\v11.0;
 AttachDbFilename=|DataDirectory|\Users.mdf;
 Integrated Security=True" 
 providerName="System.Data.SqlClient" />

但我最终不得不使用这个连接字符串,它直接指向模型以及DbContext名称

<add name="NextFlicksMVC4.Models.userAccount.Users+UserDbContext"     
 connectionString="Data Source=(LocalDB)\v11.0;
 AttachDbFilename=|DataDirectory|\Users.mdf;
 Integrated Security=True"
 providerName="System.Data.SqlClient" />

它按预期工作,我连接到App_Data文件夹中的LocalDB。

有人可以向我解释为什么只有当我将它指向DbContext类的完整路径时它才有效吗?

2 个答案:

答案 0 :(得分:3)

在UserDbContext类中指定一个构造函数,并解决问题

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

答案 1 :(得分:2)

默认构造函数,来自the documentation

  

使用约定构造一个新的上下文实例来创建名称   将要建立连接的数据库。按照惯例   name是派生上下文的全名(名称空间+类名)   类。有关如何使用它来创建的更多信息   连接,请参阅DbContext的备注部分。

来自DbContext的备注部分:

  

如果从派生中调用无参数DbContext构造函数   上下文,然后使用派生上下文的名称来查找   app.config或web.config文件中的连接字符串。

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

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