Статьи

Entity Framework 6 и SQL Server Compact 4.0 — «правильное» развертывание частного рабочего стола

Примерно через год после того, как я опубликовал пост в блоге  Entity Framework 6 и SQL Server Compact 4 (2) — Простое развертывание частного рабочего стола,  мне пришло в голову, что решение, предложенное в этом посте, далеко от совершенства — мои извинения! Однако предложения о местонахождении файла базы данных и т. Д. Остаются действительными точками.

TL; DR — используйте мой  новый пакет NuGet  для развертывания частного рабочего стола с SQL Server Compact 4.0 и Entity Framework 6 и убедитесь, что:
— Перенаправление привязки установлено на: oldVersion = «4.0.0.0-4.0.0.1»
— Prefer32Bit project опция отключена

Цель

Во-первых, давайте выясним, какова цель «развертывания частного рабочего стола» с SQL Server Compact:

цель состоит в том, чтобы иметь возможность удалить папку с файлами на любом ПК и просто запустить приложение .NET, которое включает в себя автономную реляционную базу данных и сложный ORM над этой базой данных.

Эта цель достижима с помощью SQL Server Compact 4.0 и Entity Framework 6, если на рассматриваемом ПК установлен .NET Framework 4.0.

Проблемы

Во-первых, давайте посмотрим на проблемы с подходом в приведенном выше сообщении в блоге: 
1. Этот подход использует пакет Microsoft.SqlServer.Compact, который явно использует не закрытую версию сборки System.Data.SqlServerCe.dll (которая является 4.0.0.0). И это предполагает, что ваш проект нацелен на AnyCPU. Это означает, что если в GAC установлен SQL Server Compact, будет выбрана версия оттуда. Это будет хорошо работать, если у вас точно такая же сборка SQL Server Compact как в GAC, так и в папке вашего приложения. Но это приводит нас к вопросу № 2!
2. Пакет EntityFramework.SqlServerCompact явно не зависит от версии выпуска Microsoft.SqlServer.Compact. Пакет NuGet и получит сборку 8854, которая является 4.0 SP1 CTP1, вместо сборки 8876, которая является собственно 4.0 SP1. (Я хотел бы, чтобы сборки 8854 больше не были видны на NuGet) — я работаю над исправлением  для этого, которое запланировано для EF 6.1.2. Таким образом, шансы не иметь одинаковую версию в GAC и локально относительно велики, и это приведет к возникновению ошибки, препятствующей работе вашего приложения:
возможно обнаружение несоответствия версий файла между поставщиком ADO.NET и собственными двоичными файлами SQL Server Compact что может привести к неправильной функциональности.

Ручное исправление

Если вы хотите, чтобы приложение для настольного компьютера (консоль, Windows Forms или WPF) могло работать в любом месте, используя правильное частное развертывание, выполните следующие действия (в общих чертах):

1. Установите EntityFramework.SqlServerCompact.

2. Скопируйте файлы из личной папки в C: \ Program Files (x86) в папку проекта (как описано в моем  личном развертывании с сообщением в  блоге LINQ to SQL )

3: Сделать проект только x86 (или хотя бы  убрать опцию «Предпочитать 32 бит»,  если вы включаете все неуправляемые файлы dll 

4. Отключите событие после сборки (через вкладку «Свойства проекта» / «События сборки»), чтобы предотвратить развертывание dll 4.0.0.0

5: изменить app.config

а) добавить перенаправление сборки, так как EntityFramework.SqlServerCompact.dll ссылается на версию 4.0.0.0, и мы хотим использовать 4.0.0.1:

<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Data.SqlServerCe" publicKeyToken="89845dcd8080cc91" culture="neutral"/>
<bindingRedirect oldVersion="4.0.0.0-4.0.0.1" newVersion="4.0.0.1"/>
</dependentAssembly>
</assemblyBinding>
</runtime>

б) С версией 4.0.0.0 => 4.0.0.1 в разделе DbProviderFactories:

«Автоматическое» исправление

Я опубликовал пакет NuGet  EntityFramework.SqlServerCompact.PrivateDeployment,   который выполняет большинство описанных выше действий, в частности 1, 2 (через  умный пакет, выполняющий шаг сборки ), 3 (через дополнительную команду в install.ps1), 4 и частично 5 (по какой-то причине NuGet генерирует неправильный bindingRedirect, поэтому его необходимо исправить вручную). В настоящее время в предварительной версии, пожалуйста, оставьте отзыв!

образ

Этот пакет включает в себя как поставщик EntityFramework.SqlServerCompact для EF 6.1.1, так и файлы SQL Server Compact 4.0 для частного развертывания. Я собираюсь обновить пакет до следующей версии 6.1.2 Entity Framework.