27

我们有三个项目。

  • Company.Domain(类库)
  • Company.PublicWebsite(MVC3 Web 应用程序)
  • Company.InternalWebsite(MVC3 Web 应用程序)

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

我们的 EF 5DbContext存在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
        }
    }
}

App.config然后我们在项目的根目录中有一个文件Company.Domain,它看起来像这样:

<?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-407f-b88f-d5a53a9e5feb/03.21.2013-10.25.png

System.Data.ProviderIncompatibleException:从数据库获取提供者信息时出错。这可能是由 Entity Framework 使用不正确的连接字符串引起的。检查内部异常以获取详细信息并确保连接字符串正确。---> 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-1adb086e8f0c/03.21.2013-10.30.png

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

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

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

编辑:

我什至尝试从项目中完全卸载和删除 EF 5 包并重新安装。同样的问题>:(

4

7 回答 7

64

您的启动项目是否包含 web.config 或 app.config,因为 EF 使用启动项目作为连接字符串的源

于 2013-03-21T17:44:15.960 回答
4

好的,所以起初这对我不起作用:(

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

更新数据库 -StartUpProjectName MYPROJECT.NAME -Script

尝试将其指向您 web.config/app.config 所在的启动项目

于 2014-05-20T20:52:28.557 回答
3

如果您在包管理器控制台中获得启用迁移的帮助

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")
    {
         ...
    }
....
}

这样,您就不必依赖默认连接字符串,这可能会造成混淆。

于 2014-04-03T09:51:15.723 回答
1

您说您可以通过 SQL Management Studio 进行连接,但我猜您使用的是 Windows 身份验证,而不是uid=XXXXX;pwd=XXXXX;连接字符串中提供的。

尝试让 Management Studio 使用该用户 ID 和密码进行连接。

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

于 2013-03-21T16:54:41.510 回答
1

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

朱丽叶

于 2013-03-21T17:22:29.550 回答
0

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

带有 SQL Server 2012 的实体框架 6 提供 System.Data.Entity.Core.ProviderIncompatibleException system-data-entity-core-providerin

于 2014-08-14T21:57:27.107 回答
0

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

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

此外,如果解决方案中的多个项目启用了迁移,请在执行添加迁移后始终在每个项目上运行更新数据库。我的 web 项目有一个挂起的迁移,并且由于第一个项目中的挂起迁移,第二个项目的迁移奇怪地失败了。

于 2014-08-26T09:36:20.187 回答