2

使用 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 类的完整路径时才有效?

4

2 回答 2

3

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

        public UserDbContext() : base("UserDbContext") {}
于 2013-04-18T13:52:14.617 回答
2

默认构造函数,来自文档

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

从 DbContext 的备注部分:

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

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

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

于 2013-01-13T18:15:26.263 回答