Использование Entity Framework 6 с SQL Server Compact 4
Я пытаюсь создать базу данных SQL Server Compact из кода, используя сценарий "сначала код", используя Entity Framework. Все работало, пока я не понял, что я установил SQL Server 2014 Express, и он использовал его (вместо локального .sdf
файл, который я и ищу). Поэтому я удалил SQL Server 2014 Express.
Теперь в моем решении я использую EntityFramework.SqlServerCompact
расширение nuget.
Однако всякий раз, когда я пытаюсь инициализировать DbContext
Я получаю ошибку:
"При установлении соединения с SQL Server произошла ошибка, связанная с сетью или конкретным экземпляром. Сервер не был найден или не был доступен. Убедитесь, что имя экземпляра указано правильно и что SQL Server настроен для разрешения удаленных подключений. (Поставщик: Сетевые интерфейсы SQL, ошибка: 26 - ошибка при поиске сервера / указан экземпляр)"
Я попытался настроить строку подключения в app.config
чтобы:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
<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>
<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlCeConnectionFactory, EntityFramework">
<parameters>
<parameter value="System.Data.SqlServerCe.4.0" />
</parameters>
</defaultConnectionFactory>
<providers>
<provider invariantName="System.Data.SqlServerCe.4.0" type="System.Data.Entity.SqlServerCompact.SqlCeProviderServices, EntityFramework.SqlServerCompact" />
</providers>
</entityFramework>
<system.data>
<DbProviderFactories>
<remove invariant="System.Data.SqlServerCe.4.0" />
<add name="Microsoft SQL Server Compact Data Provider 4.0" invariant="System.Data.SqlServerCe.4.0" description=".NET Framework Data Provider for Microsoft SQL Server Compact" type="System.Data.SqlServerCe.SqlCeProviderFactory, System.Data.SqlServerCe, Version=4.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" />
</DbProviderFactories>
</system.data>
<connectionStrings>
<add name="CompactDBContext"
providerName="System.Data.SqlServerCe.4.0"
connectionString="MyDatabase.sdf"/>
</connectionStrings>
</configuration>
Или установив его в коде, передав его в DbContext
конструктор, различные варианты строки подключения и т.д...
Это объявление DbContext:
public class CompactDBContext : DbContext
{
public DbSet<MyItem> MyItems { get; set; }
}
И вот как я это использую:
public void InsertItem()
{
using (var db = new CompactDBContext())
{
MyItem item = new MyItem();
db.MyItems.Add(item);
db.SaveChanges();
}
}
Я почти уверен, что это либо повторяющийся вопрос, либо я упускаю что-то действительно тривиальное, но я потратил часы на выяснение этого без какой-либо удачи.
Может ли кто-нибудь указать правильное направление?
Обновление 1:
Используя конструктор DbContext с SqlCeConnection в качестве параметра:
public CompactDBContext() :
base(new SqlCeConnection("Data Source=MyDatabase.sdf;Persist Security Info=False;"),
contextOwnsConnection: true) { }
Я получаю эту ошибку:
Исключение типа "System.InvalidOperationException" произошло в EntityFramework.dll, но не было обработано в коде пользователя
Дополнительная информация: не найден поставщик Entity Framework для поставщика ADO.NET с именем-инвариантом System.Data.SqlServerCe.4.0. Убедитесь, что поставщик зарегистрирован в разделе "entityFramework" конфигурационного файла приложения. См. http://go.microsoft.com/fwlink/?LinkId=260882 для получения дополнительной информации.
2 ответа
Поиграв с решением и проектом, я выяснил причину. В моей настройке мое приложение является библиотекой, и я тестировал его из проекта UnitTest. По какой-то причине я по ошибке выгрузил app.config из проекта UnitTest, поэтому он жаловался на отсутствие поставщиков EntityFramework. Загрузка app.confing обратно в проект исправила проблему.
Убедитесь, что вы установили System.Data.SqlServerCE.dll в
C:\Program Files\Microsoft SQL Server Compact Edition\v4.0\Private
если нет, вы должны установить до SSCERuntime-ENU.msi отсюда:
https://www.microsoft.com/es-es/download/details.aspx?id=17876