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类的完整路径时它才能工作吗?

asp.net mvc-使用C#MVC4和匹配DbContext类名与ConnectionString名称来使用正确的数

在UserDbContext类中指定这样的构造函数,将解决问题

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

默认构造函数,来自文档:

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

来自DbContext:的备注部分

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

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

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