Обновление: после того, как я удалил и воссоздал миграцию снова 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 стол, ушел ошибка. Нужно ли мне обновлять миграцию для адресации 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);
}
«Теперь, когда я удаляю таблицу dbo._MigrationHistory, ошибка исчезла». - Это не имеет смысла. Действительно ли EF обращается к базе данных? Что такое инициализатор? Тем не менее, я знаю, что у EF есть некоторые проблемы, обновляющие ссылки. Вы уверены, что все подключения являются SqlConnections, а указанная строка подключения указывает на правильный провайдер? – DevilSuichiro
@DevilSuichiro Да, вы правы, это не имеет смысла, может быть, я ошибаюсь, но я не знаю об этом. Я дважды проверяю строку подключения, которая указывает правильность провайдера, я уточню вопрос, чтобы быть более понятным , –
базовый конструктор принимает строку соединения/DbConnection, ContextOwnsConnection. Что происходит, когда вы используете базу (новый SqlConnection (connectionString), true)? А что такое CarRentalDbInitializer()? – DevilSuichiro