EF 5 Migrations不能连接到我们的数据库,即使它在运行时做得很好

本文关键字:运行时 很好 数据库 不能 Migrations 连接 我们 EF | 更新日期: 2023-09-27 18:05:04

我们有三个项目。

  • 公司。域(类库)
  • 公司。PublicWebsite (MVC3 Web Application)
  • 公司。内部网站(MVC3 Web应用程序)

两个网站项目都参考了Company.Domain .

我们的EF 5 DbContext生活在Company.Domain.Data.EntityFramework中,它看起来像这样:

using System.Data.Entity;
using Company.Domain.Data.EntityFramework.Entities;
namespace Company.Domain.Data.EntityFramework.
{
    public class CompanyEntities : DbContext
    {
        public DbSet<Notification> Notifications { get; set; }
        public DbSet<Report> Reports { get; set; }
        public DbSet<ReportSection> ReportSections { get; set; }
        public DbSet<ReportPage> ReportPages { get; set; }
        // brevity brevity
    }
}

我们过去已经启用了迁移并成功地使用了这个工具,所以我不确定为什么我们现在有问题。我们的迁移配置位于Company.Domain.Data.EntityFramework.Migrations中,看起来像这样:

namespace Company.Domain.Data.EntityFramework.Migrations
{
    using System;
    using System.Data.Entity;
    using System.Data.Entity.Migrations;
    using System.Linq;
    using Company.Domain.Data.EntityFramework;
    public class Configuration : DbMigrationsConfiguration<CompanyEntities>
    {
        public Configuration()
        {
            MigrationsDirectory = @"Data'EntityFramework'Migrations";
            AutomaticMigrationsEnabled = false;
        }
        protected override void Seed(CompanyEntities context)
        {
            // empty at the moment
        }
    }
}

Company.Domain项目的根目录下有一个App.config文件,它看起来像这样:

<?xml version="1.0" encoding="utf-8"?>
  <configuration>
    <configSections>
      <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
      <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    </configSections>
    <connectionStrings>
      <add name="CompanyEntities" providerName="System.Data.SqlClient" connectionString="Data Source=devsql;Initial Catalog=CompanyEntities;uid=XXXXX;pwd=XXXXX;MultipleActiveResultSets=True;" />
    </connectionStrings>
    <entityFramework>
      <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
        <parameters>
          <parameter value="v11.0" />
        </parameters>
      </defaultConnectionFactory>
    </entityFramework>
    <startup>
      <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>
  </configuration>

我们的数据库位于网络上的另一台服务器上。我能够在SQL Server Management Studio中连接到它我们的应用程序能够在运行时连接得很好。但是,当我尝试运行add-migration甚至update-database时,我得到以下错误:

http://content.screencast.com/users/chevex/folders/snagit/media/80fbfd6a - 4956 - 407 - f - b88f d5a53a9e5feb/03.21.2013 10.25.png

System.Data。ProviderIncompatibleException:从数据库获取提供程序信息时发生错误。这可能是由实体框架使用不正确的连接字符串引起的。详细检查内部异常,并确保连接字符串正确。System.Data.ProviderIncompatibleException:提供程序没有返回ProviderManifestToken字符串。--> System.Data.SqlClient.SqlException:在建立到SQL Server的连接时发生与网络相关或特定实例的错误。未找到服务器或无法访问服务器。验证实例名是否正确,SQL Server是否配置为允许远程连接。

我甚至恢复了对模型的更改,然后运行update-database只是为了看看它是否会说"数据库是最新的迁移",但我仍然得到了上述错误。我一遍又一遍地倒在App.config的连接字符串上。我不明白为什么迁移不会连接,但我们的两个网站项目在运行时工作得很好。迁移在过去是有效的。下面是解决方案资源管理器中的迁移与数据库中__MigrationHistory表中的迁移的比较。

http://content.screencast.com/users/chevex/folders/snagit/media/7abeaa46 ff0f - 4817 a0d7 - 1 - adb086e8f0c/03.21.2013 10.30.png

http://content.screencast.com/users/chevex/folders/snagit/media/3c6ac54d f63d - 417 f - 9253 - 39 - b6a8fea85d/03.21.2013 10.32.png

看起来我应该能够运行update-database并让它告诉我它是最新的,但我得到了这个错误。

据我所知,当我运行迁移命令时,迁移不应该关注我们的两个网站项目,但我倾注了他们的Web。配置文件也是以防万一。连接字符串与App.config相同。

编辑:

我甚至试过完全卸载并从项目中删除EF 5包并重新安装。

EF 5 Migrations不能连接到我们的数据库,即使它在运行时做得很好

您的开始项目是否包含web ?配置或app.config作为EF使用启动项目作为连接字符串的来源

OK,所以这一开始对我不起作用:(

然后在喝了一杯咖啡并添加StartUPProjectName之后,它做到了!试一试:

Update-Database -StartUpProjectName MYPROJECT。NAME -Script

尝试将它指向一个启动项目,其中web.config/app。config lives

如果您在Package Manager Console中获得启用迁移的帮助

Get-Help enable-migrations -detailed

你可以在-StartupProjectName选项中找到这个文档:

-StartUpProjectName

    Specifies the configuration file to use for named connection strings. If
    omitted, the specified project's configuration file is used.

文档有点令人困惑,但这意味着如果您使用此选项指定项目名称,迁移将在指定项目的配置文件中查找连接字符串。(配置文件为web.configapp.config)

如果你正在创建一个web应用程序,最可能的连接字符串将在它的web.config中,所以你必须指定web应用程序项目。如果它是其他类型的项目,连接字符串将在类库或其他app.config文件中,并且您必须指定该项目。

此外,建议您使用DbContext类的构造函数来指定连接字符串的名称,即

public class CompanyEntities : DbContext
{
    public CompanyEntities()
       :base("ConnectionStringName")
    {
         ...
    }
....
}

这样你就不需要依赖默认的连接字符串,这可能会让人困惑。

你说你可以通过SQL管理工作室连接,但我的猜测是你使用Windows身份验证,而不是在你的连接字符串提供的uid=XXXXX;pwd=XXXXX;

尝试使用该用户名和密码让Management Studio连接。

此外,该帐户可能被锁定(如果它是Active Directory帐户)。

这听起来很像我的一个客户遇到的问题。这与machine.config的DbProviders部分搞砸了有关。他把细节放在这里:http://social.msdn.microsoft.com/Forums/en-US/adodotnetentityframework/thread/f2a19487-6d38-4a79-a809-d3efe4c9d9fe(这是亚当·肖尔茨对老板问题的回答)。:))

Julie

可能这已经解决了,但我通过在我的解决方案中设置启动项目来解决实体dll项目(具有app.config文件)。我确实将包管理器控制台窗口中的"默认项目"设置为正确的实体dll项目,但这不起作用。查看详情

实体框架6与SQL Server 2012给出System.Data.Entity.Core.ProviderIncompatibleExceptionsystem-data-entity-core-provider

如果您的解决方案有多个项目,请尝试将解决方案的启动项目设置为包含Web的项目。配置文件或App.Config文件,包含EF的设置。

我有一个解决方案,一个Web项目和我的模型的独立项目(Data.Models)。一切都很顺利,直到我在解决方案中添加了控制台应用程序。一旦我将其设置为启动项目,EF Migrations就会失败。

同样,如果解决方案中的多个项目启用了迁移,那么在执行Add-Migration之后,始终在每个项目上运行Update-Database。我的web项目有一个挂起的迁移,由于第一个项目的迁移挂起,第二个项目的迁移奇怪地失败了。

相关文章: