使用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类的完整路径时它才有效吗?
答案 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
命名。如果您希望连接字符串单独与类名匹配,则无法将其嵌套在模型中。