DbContext在不同的类中表现不同

时间:2012-06-07 14:53:40

标签: c# asp.net-mvc-3 entity-framework azure

我有一个本地 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();
}

当我执行此操作时,我实际上可以在代码优先生成的数据库中查看内容(使用实体框架)。数据库:ExampleDb,表:ExampleItem。

但是,在 ExampleController 中执行完全相同的操作不会更新数据库。相反,这些数据会转移到其他地方(我不知道在哪里)。当我通过浏览器访问我的控制器时,我可以上传数据并查看它,但它没有存储在我的ExampleDb数据库中,只有从WebRole.cs发送的数据才在数据库中。

有什么想法会导致这种行为吗?

ExampleDb.cs 如下所示:

public class ExampleDb : DbContext
{
    public ExampleDb() : base("ExampleDb") { }
    public DbSet<ExampleItem> ExampleItemEntries { get; set; }     
}

2 个答案:

答案 0 :(得分:2)

您的连接字符串包含'User Instance = True'。这意味着SQLEXPRESS使用用户实例来存储您的数据。这是一个完全不同的SQL Server实例,它包含一组新的数据库。

我假设WebRole.cs中的代码在与ExampleController中的代码不同的用户帐户中运行。当ExampleController在非管理员的用户帐户下运行时,将使用用户实例...

因此,当您从连接字符串中删除“User Instance = True”并为SQLEXPRESS数据库实例分配适当的访问权限时,这将解决问题。

答案 1 :(得分:0)

在CodeFirst Model中,您应首先在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角色中可以正常工作,因此您可以尝试上述方法。