我有一个本地 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; }
}
答案 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角色中可以正常工作,因此您可以尝试上述方法。