EF6迁移(LocalDb)更新 - 数据库登录失败

时间:2014-02-06 01:09:18

标签: entity-framework asp.net-mvc-5 ef-migrations localdb

VS 2013 MVC5代码第一个项目。

我正在使用ASP.NET Getting Started with EF6 using MVC5教程来快速了解最新的更改,并且我遇到了迁移问题。 在第一个模块中,使用数据库初始化程序创建数据库:

<contexts>
      <context type="ContosoUniversity.DAL.SchoolContext, ContosoUniversity">
        <databaseInitializer type="ContosoUniversity.DAL.SchoolInitializer, ContosoUniversity" />
      </context>
</contexts>

和这个连接字符串:

<connectionStrings>
    <add name="SchoolContext" connectionString="Data Source=(LocalDb)\v11.0;Initial Catalog=ContosoUniversity1;Integrated Security=SSPI;" providerName="System.Data.SqlClient"/>
</connectionStrings>

这很好用。在Code First迁移和部署模块中,将设置迁移。初始化程序已注释掉,DB的名称更改为ContosoUniversity2:

<connectionStrings>
    <add name="SchoolContext" connectionString="Data Source=(LocalDb)\v11.0;Initial Catalog=ContosoUniversity2;Integrated Security=SSPI;" providerName="System.Data.SqlClient"/>
</connectionStrings>

然后从Packager Manager Console运行update-database时,它失败并显示错误消息:

Cannot open database "ContosoUniversity2" requested by the login. The login failed.
Login failed for user 'MyMachine\MyUser'.

我使用相同的用户和相同的结果多次重新运行这两种方案。如果我将Initial Catalog更改为AttachDbFilename=|DataDirectory|\ContosoUniversity2; update-database成功(数据库现在位于项目的App-Data文件夹中,而不是用户个人资料的根目录):

<connectionStrings>
    <add name="SchoolContext" connectionString="Data Source=(LocalDb)\v11.0; AttachDbFilename=|DataDirectory|\ContosoUniversity2;Integrated Security=SSPI;" providerName="System.Data.SqlClient"/>
</connectionStrings>

虽然在部署时必须使用Initial Catalog。生产connectionString在Web.Release.Config中单独设置,以便可行。

问题是为什么需要修复,为什么Initial Catalog不能在开发方面使用update-database

更新1:

问题不在于迁移,而在于LocalDb

MyUser拥有SQLExpresssysadmin)的完全权利。我可以在SSMS下登录MyUser并完全管理DBs。我做了几次测试。即使我为教程创建了初始数据库MyUser,如果我从头开始重建应用程序并使用databaseInitialzer,它现在会抛出登录失败错误。如果我在VSAdmin运行databaseInitialzerupdate-databaseDBs工作没有任何问题。如果我将Admin'sMyUser's用户个人资料根目录复制到VS,然后运行Admin,而不是MyUser,同时登录为{{1}如果databaseInitialzer先前存在,则update-databaseDB都可以正常工作。

如果我将connectionString更改为AttachDbFileName并运行databaseInitialzerupdate-database MyUser可以在{{1}中创建DB文件夹证明App_Data具有MyUser创建权限。 DB显然拥有自己用户个人资料的根目录的完全权限。 LocalDb实施有一些问题。

有没有人对这个问题有任何见解?

7 个答案:

答案 0 :(得分:15)

如果删除了DB文件,它仍然会在SqlLocalDB中注册。如果LocalDb挂起而无法附加(手动删除DB文件后)或登录失败,请参阅JSobell和CodingwithSpike的答案:

ef5-cannot-attach-the-file-0-as-database-1

从PM控制台运行'sqllocaldb.exe stop v11.0'和'sqllocaldb.exe delete v11.0'

<强>更新

更容易使用SSMS。服务器名称:(本地)\ v11.0,Windows身份验证。这确实是管理localdb数据库的最佳方式。

答案 1 :(得分:6)

我正在使用VS 2013和EF6.1。

当我使用迁移和删除数据库时,我遇到了类似的错误。 我无法再次重新创建数据库。 发现由于SQLExpress本地数据库实例导致的错误在后台运行并保持已删除的数据库连接。

以下是处理这种情况的步骤。

  1. 删除数据库文件(.mdf和.ldf)文件。
  2. 从您的应用程序中删除迁移文件夹。
  3. 从服务器资源管理器数据连接中删除与该数据库的任何数据库连接。
  4. 转到Windows命令提示符(IF VS 2012或更早版本,您必须使用VS命令提示符)。
  5. 运行&#34; sqllocaldb.exe停止v11.0&#34; (这将停止v11.0服务)
  6. 运行&#34; sqllocaldb.exe删除v11.0&#34; (这将删除v11.0服务)
  7. 转到Visual Studio中的程序包管理器控制台。
  8. 运行&#34;启用 - 迁移&#34; (这将创建迁移文件夹和内容)
  9. 运行&#34; Add-Migration init&#34; (这将支持对下一次迁移的更改)
  10. 运行&#34;更新 - 数据库&#34; (这将再次创建数据库)

答案 2 :(得分:2)

我将“标准安全性”更改为“可信连接”

Server = myServerAddress; Database = myDataBase; Trusted_Connection = True;

在appsetting.json中,您可以编写此代码

`{

  "ConnectionStrings": {
    "onlineStoreDB": "Server=.;Database=onlineStore;Trusted_Connection=True"
     },

    "Logging": {
      "LogLevel": {
        "Default": "Information",
        "Microsoft": "Warning",
        "Microsoft.Hosting.Lifetime": "Information"
      }
    },
    "AllowedHosts": "*"
  }`

对我有用。

答案 3 :(得分:1)

从连接字符串

进行交换
  

数据源=(LocalDb)\ v11.0;

  

服务器= \的SQLExpress;

这有助于我在迁移过程中使用Code First技术

答案 4 :(得分:0)

这将解决您的问题,您可以根据需要更新和添加任意数量的方法和属性

注意:第1步{如果您在教程中启动了数据库}

从PM控制台:

  1. 启用 - 迁移--ContextTypeName ContosoUniversity.DAL.SchoolContext

  2. add-migration Initial

  3. 更新的数据库

答案 5 :(得分:0)

我有点迟了但我在做Getting Started with EF6 using MVC5时遇到了同样的问题。

由于示例中的数据库初始化无效,出现此问题。

更改

public class SchoolInitializer : System.Data.Entity. DropCreateDatabaseIfModelChanges<SchoolContext>

public class SchoolInitializer : CreateDatabaseIfNotExists<SchoolContext>

它将创建没有问题的数据库。

默认情况下,示例中使用的初始化方法不会创建新数据库。不确定它是不是一个bug。

答案 6 :(得分:0)

'PM>启用迁移 Enable-Migrations已过时。使用添加迁移来开始使用迁移。'

相关问题