Подтвердить что ты не робот

EF 5 Миграции не могут подключаться к нашей базе данных, хотя она отлично работает во время выполнения

Я слишком долго боролся с этой неожиданной ошибкой, и мне действительно нужно понять это. Позвольте мне описать нашу структуру проекта.

У нас есть три проекта.

  • Компания .Domain(библиотека классов)
  • Company.PublicWebsite(веб-приложение MVC3)
  • Компания. Внутренний веб-сайт (веб-приложение MVC3)

Два проекта веб-сайта имеют ссылку на 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
        }
    }
}

Затем мы имеем файл 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.

Любая помощь будет принята с благодарностью. Это была битва за день, и мне действительно нужно понять это.

Edit:

Я даже пытался полностью удалить и удалить пакет EF 5 из проектов и переустановить. Тот же выпуск > : (

4b9b3361

Ответ 1

Был ли ваш проект запуска web.config или app.config, поскольку EF использует начальный проект как источник строки подключения

Ответ 2

Хорошо, так что сначала не работало для меня: (

Затем, после чашки кофе и добавив к нему StartUPProjectName, он сделал это! Попробуйте:

Update-Database -StartUpProjectName MYPROJECT.NAME - Script

Попробуйте указать его в проект запуска, где вы работаете в web.config/app.config

Ответ 3

Если вы получите помощь для включения миграции в консоли диспетчера пакетов

Get-Help enable-migrations -detailed

Вы можете найти эту документацию для опции -StartupProjectName:

-StartUpProjectName

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

Документ немного запутан, но это означает, что если вы используете эту опцию для указания имени проекта, миграции будут искать строку соединения в файле конфигурации указанного проекта. (Конфигурационный файл может быть web.config или app.config).

Если вы создаете веб-приложение, скорее всего строка подключения будет находиться в web.config, поэтому вы должны указать проект веб-приложения. Если это другой проект, строка соединения будет находиться в файле app.config библиотеки классов или что-то еще, и вам нужно будет указать этот проект.

Кроме того, рекомендуется использовать конструктор для вашего класса DbContext, который указывает имя строки подключения, т.е.

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

Таким образом, вы не будете зависеть от строк подключения по умолчанию, которые могут запутать.

Ответ 4

Вы говорите, что можете подключиться через SQL Management Studio, но я предполагаю, что для этого используется аутентификация Windows, а не uid=XXXXX;pwd=XXXXX;, указанная в вашей строке подключения.

Попробуйте подключиться к Management Studio, используя этот идентификатор пользователя и пароль.

Кроме того, эта учетная запись может быть заблокирована (если это учетная запись Active Directory).

Ответ 5

Это звучит жутко, как проблема, с которой столкнулся мой клиент. Это связано с чем-то, скомпрометировавшим раздел DbProviders файла machine.config. Он поставил подробности здесь: http://social.msdn.microsoft.com/Forums/en-US/adodotnetentityframework/thread/f2a19487-6d38-4a79-a809-d3efe4c9d9fe (это ответ Адама Шольца на вопрос его босса:):)

Джулия

Ответ 6

Возможно, это уже решено, но я решил его решить, установив проект запуска в мое решение для проекта dll объекта (имеющего файл app.config). Я установил "Проект по умолчанию" в окне консоли диспетчера пакетов в правильный проект DLL-объекта, но это не сработало. Для деталей

Entity Framework 6 с SQL Server 2012 предоставляет System.Data.Entity.Core.ProviderIncompatibleException системы данных сущность-ядро-providerin

Ответ 7

Если ваше решение имеет несколько проектов, попробуйте настроить Startup Project для решения проекта, содержащего файл Web.Config или App.Config, содержащий настройки для EF.

У меня было решение с веб-проектом и отдельным проектом (Data.Models) для моих моделей. Все было хорошо, пока я не добавил консольное приложение к решению. Как только я установил, что это проект запуска, EF Migrations завершится с ошибкой.

Кроме того, если в нескольких проектах в решении включены миграции, всегда выполняйте обновление базы данных по каждому проекту после добавления миграции. У моего веб-проекта была ожидающая миграция, и миграция не удалась по второму проекту из-за ожидающей миграции в первом.