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; }     
}

DbContext 在不同的类中表现不同

连接字符串包含"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 角色中工作正常,因此您可以尝试如上所述。