DbContext 在不同的类中表现不同
本文关键字:DbContext | 更新日期: 2023-09-27 18:36:26
我有一个本地 ASP.NET MVC 3 Windows Azure项目,其中我使用MSSQL Express的本地实例作为我的模拟器。
在我的 web.config 中,我有以下连接字符串:
<add name="ExampleDb" connectionString="data source=.'SQLEXPRESS;Integrated Security=SSPI;Initial Catalog=ExampleDb;User Instance=true;MultipleActiveResultSets=True" providerName="System.Data.SqlClient" />
出于调试目的,我的 WebRole.cs 文件中有以下内容:
public override bool OnStart()
{
ExampleDb context = new ExampleDb();
context.ExampleItemEntries.Add(new ExampleItem() { ExampleItemId = 1, Att1 = "1", Att2 = "2" });
context.SaveChanges();
return base.OnStart();
}
执行此操作时,我实际上可以看到代码优先生成的数据库中的内容(使用实体框架)。数据库:示例数据库,表:示例项。
但是,在 ExampleController 中执行完全相同的操作不会更新数据库。相反,这些数据去了其他地方(我不知道在哪里)。当我通过浏览器访问我的控制器时,我可以上传数据并查看它,但它不存储在我的 ExampleDb 数据库中,只有从 WebRole.cs 发送的数据在数据库中。
知道是什么导致了这种行为吗?
示例 Db.cs 如下所示:
public class ExampleDb : DbContext
{
public ExampleDb() : base("ExampleDb") { }
public DbSet<ExampleItem> ExampleItemEntries { get; set; }
}
连接字符串包含"User Instance=True"。这意味着 SQLEXPRESS 使用用户实例来存储您的数据。这是一个完全不同的 SQL Server 实例,其中包含一组新的数据库。
我假设 WebRole.cs 中的代码在与 ExampleController 中的代码不同的用户帐户中运行。当示例控制器在非管理员用户帐户下运行时,将使用用户实例...
因此,当您从连接字符串中删除"User Instance=True"并为 SQLEXPRESS 数据库实例分配适当的访问权限时,这将解决问题。
在 CodeFirst 模型中,应首先在 web.config 中定义连接字符串,如下所示:
<connectionStrings>
<add name="ExampleDbConnection"
connectionString="data source=.'SQLEXPRESS;Integrated Security=SSPI;
database=ExampleDb;
AttachDBFilename=|YouDataDirectory|yourdb.mdf;
User Instance=true"
providerName="System.Data.SqlClient" />
<connectionStrings/>
DbContext 类构造函数接受在 web.config 中指定连接字符串名称的名称-值对。因此,您可以在上下文中引用此连接字符串:
class ExampleDb : DbContext
{
public ExampleDb() : base("name=ExampleDbConnection") { }
...
}
此代码在 ASP.NET MVC Web 角色中工作正常,因此您可以尝试如上所述。