asp.net mvc-使用C#MVC4和匹配DbContext类名与ConnectionString名称来使用正确的数
本文关键字:ConnectionString asp C#MVC4 使用 mvc- DbContext net | 更新日期: 2023-09-27 17:50:58
使用EF Code First,我知道必须将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类的完整路径时它才能工作吗?
在UserDbContext类中指定这样的构造函数,将解决问题
public UserDbContext() : base("UserDbContext") {}
默认构造函数,来自文档:
使用约定构建新的上下文实例以创建名称将要建立连接的数据库的。按照惯例name是派生上下文的全名(名称空间+类名(班有关如何使用它创建连接,请参阅DbContext的备注部分。
来自DbContext:的备注部分
如果无参数DbContext构造函数是从派生的上下文,则派生上下文的名称用于查找app.config或web.config文件中的连接字符串。
如果使用反编译器查看DbContext
中默认构造函数的代码,您会看到它在DbContext
实例上调用GetType().ToString()
,并使用该值来查找连接字符串。因此,为什么DbContext
的完全限定类型名是用于命名连接字符串的有效约定是完全合理的。
在您的示例中,UserDbContext
不是合适的名称,因为它是一个嵌套类。您可以省略名称空间,但至少必须将连接字符串命名为Users+UserDbContext
。如果希望连接字符串仅与类名匹配,则不能将其嵌套在模型中。