2

Обновление: после того, как я удалил и воссоздал миграцию снова SQL Server, никаких ошибок. Так что кажется, что первоначальный провайдер закодирован где-то в снимке модели.Является ли Framework Framework Entity First Migrations привязаны к конкретной СУБД?

Update:

Created video to visualize the problem

Я не знал об этом, но это, кажется, что Entity Framework Code First Миграции связана с конкретной СУБД. Я использовал в своем демо-приложении SQL Server Compact Edition 4.0, и я переношу его в SQL Server 2014 Express LocalDB.

базы данных схемы в SQL Server создан правильно, но при попытке чтения или записи в базу данных я получаю следующее сообщение об ошибке

Нет Entity Framework поставщик найдено для поставщика ADO.NET с инвариантом названием «System .Data.SqlServerCe.4.0.

Я не использую SQL Server CE нигде, все пакеты NuGet удалены, поставщик удален из App.Config.

App.config

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
    <configSections> 
    <section name="entityFramework" 
      type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.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 configSource="ConnectionStrings.config" /> 
    <entityFramework> 
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" /> 
    <providers> 
     <provider invariantName="System.Data.SqlClient" 
       type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" /> 
    </providers> 
    </entityFramework> 
    <startup> 
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /> 
    </startup> 
</configuration> 

ConnectionStrings.config

<?xml version="1.0" encoding="utf-8"?> 
<connectionStrings> 
    <clear/> 
    <add name="CarRentalDb" connectionString="Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=CarRentalDb;Integrated Security=True;multipleactiveresultsets=True" providerName="System.Data.SqlClient"/> 
</connectionStrings> 

CarRentalDbContext.cs

public class CarRentalDbContext : DbContext 
{ 
    public CarRentalDbContext() 
     //only used until development, will not be checked in 
     : base(@"Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=CarRentalDb;Integrated Security=True;Connect Timeout=30;Encrypt=False;TrustServerCertificate=True;ApplicationIntent=ReadWrite;MultiSubnetFailover=False") 
    { 
     Database.SetInitializer(new CarRentalDbInitializer()); 
    } 

    public CarRentalDbContext(string nameOrConnectionString) : base(nameOrConnectionString) 
    { 
     Database.SetInitializer(new CarRentalDbInitializer()); 
    } 
} 

dbo._MigrationHistories

dbo._MigrationHistories

Теперь, когда я удалить dbo._MigrationHistories стол, ушел ошибка. Нужно ли мне обновлять миграцию для адресации SQL Server вместо SQL Server CE?

NewCustomerIsCreated.cs

[TestMethod] 
    public void NewCustomerIsCreated() 
    { 
     var customerLastName = CustomersLastNameToBeDeleted; 

     //Arrange 
     var systemUnderTest = new CarRentalBusinessLayer(); 
     var customerToBeCreated = _autoFixture.Build<CustomerModel>() 
               .Without(property => property.CustomerId) 
               .With(property => property.CustomerType, CustomerModel.Consumer) 
               .With(property => property.LastName, customerLastName).Create(); 
     var expectedResult = customerToBeCreated; 

     //Act 
     systemUnderTest.CreateNewCustomer(customerToBeCreated.FirstName, customerToBeCreated.LastName, customerToBeCreated.DateOfBirth, customerToBeCreated.Street, customerToBeCreated.City, customerToBeCreated.Postcode, 
      customerToBeCreated.CustomerType); 

     //Assert 
     Customer actualResult; 
     using (var carRentalDbContext = new CarRentalDbContext(_connectionString)) 
     { 
      actualResult = carRentalDbContext.Customers.SingleOrDefault(c => c.LastName == customerLastName); 
     } 
     Assert.IsTrue(actualResult != null && expectedResult.LastName == actualResult.LastName); 
    } 
+0

«Теперь, когда я удаляю таблицу dbo._MigrationHistory, ошибка исчезла». - Это не имеет смысла. Действительно ли EF обращается к базе данных? Что такое инициализатор? Тем не менее, я знаю, что у EF есть некоторые проблемы, обновляющие ссылки. Вы уверены, что все подключения являются SqlConnections, а указанная строка подключения указывает на правильный провайдер? – DevilSuichiro

+0

@DevilSuichiro Да, вы правы, это не имеет смысла, может быть, я ошибаюсь, но я не знаю об этом. Я дважды проверяю строку подключения, которая указывает правильность провайдера, я уточню вопрос, чтобы быть более понятным , –

+0

базовый конструктор принимает строку соединения/DbConnection, ContextOwnsConnection. Что происходит, когда вы используете базу (новый SqlConnection (connectionString), true)? А что такое CarRentalDbInitializer()? – DevilSuichiro

ответ

0

Обратная связь OP в:

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

Оригинал Ответ:

Да, безусловно, вы должны сделать that.That означает, что вы должны delete данные о __MigrationHistory таблицы и нужно recreate его.

Если вы видите изображение ниже, вы можете увидеть столбец ProductVersion. Это причина вашей ошибки времени выполнения.

enter image description here

Update: Это версия EF.

<package id="EntityFramework" version="6.1.3" targetFramework="net461" /> 
+0

Но что именно означает * ProductVersion *? –

+1

ProductVersion используется версия EF. – DevilSuichiro

+0

См. Раздел «Обновление». – Sampath