Задать вопрос

Как развернуть приложение через ClickOnce, использующую Entity Framework?

Решил поближе познакомиться с миром EF. Так как я для работы использую MySql, то на нём и проводил все эксперименты. Для последовательности мыслей вот базовый необходимый список шагов, которые я выполняю для создания тестового примера:
1. Программная начинка машины: Windows 8.1 Pro, VS2013, MySQL Connector 6.8.3, MySQL for VS 1.2
2. Создаю в VS консольное приложение на языке C#
3. В проект добавляю новый элемент:
0a6949552c5d49a39ded878eaa42854b.png

4. Выбираем нужную модель:
c09d029e943e4c3391a5e3383d2c1c05.png

5. Выбираем (или создаем новое, если его нету) соединение:
25456e3ab5bd40bd8efb33a63fdcdaa7.png

6. Выбираем версию EF 5.0 (хотя особых вариантов нету):
bb1d7dcb051a4b808ac318d2f3f6f026.png

7. Для простоты эксперимента выберем одну таблицу:
bceba6d8b31f4d22a7877721b1bacc2e.png

8. В появившемся файле App.config подправим адрес базы данных (127.0.0.1 -> 192.168.0.37), чтобы в конечном итоге полученное приложение можно было запустить на разных машинах:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=4.4.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  </configSections>
  <connectionStrings>
    <add name="DbEntities"
         connectionString="metadata=res://*/Model.csdl|res://*/Model.ssdl|res://*/Model.msl;provider=MySql.Data.MySqlClient;provider connection string=&quot;server=192.168.0.37;user id=root;password=blablabla;persistsecurityinfo=True;database=testbase&quot;"
         providerName="System.Data.EntityClient" />
  </connectionStrings>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
  </entityFramework>
</configuration>

9. Пишем простенький код, который выводит количество записей в таблице:
using System;
using System.Linq;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                DbEntities context = new DbEntities();
                int count = (from a in context.t_abook
                             select a).Count();

                Console.WriteLine("Count records = {0}", count);
            }
            catch (Exception ex)
            {
                Console.WriteLine("Exception:\n{0}\n", ex.Message);

                if (ex.InnerException != null)
                    Console.WriteLine("InnerException:\n{0}\n", ex.InnerException.Message);

                Console.WriteLine("Stacktrace:\n{0}", ex.StackTrace);
            }
            finally
            {
                Console.ReadLine();
            }
        }
    }
}


10. Запускаем. Всё прекрасно работает.
3029dec779de4d7f8214cda2d1de4d42.png

11. Теперь открываем свойства проекта, на вкладке Signing создаем тестовый сертификат, подписываем манифест.

12. На вкладке Publish взглянем на файлы, которые идут в итоговый проект:
abc69a64cfaa4f73ac9b779d921c73c0.png

13. Публикуем всё это дело куда-нибудь

14. На всякий случай проверяем опять, всё ли работает? Запустим ConsoleApplication1.application, развертывание проходит успешно. Приложение без проблем показало количество записей в нашей таблице как в предыдущем примере.

Вроде бы всё прекрасно, но если теперь запустить ConsoleApplication1.application на другой машине, не девелоперской, то мы получим сообщение об ошибке - указанный поставщик хранилища не найден в конфигурации или недопустим.
e21c9986e19445b588ab278587e4ce8a.png

Опытным путем было установлено, что приложение не может погрузить MySql.Data.MySqlClient из GAC. Если на клиентскую машину установить MySQL Connector 6.8.3, то проблема исчезает. Этим решением можно было бы воспользоваться, если бы его пришлось проделать пару-тройку раз, но в реальности приложение должно будет работать примерно 70-80 компьютерах, не набегаешься( К тому же запуск инсталлера требует админских прав.

Также я пробовал создать приложение с использованием EF6 из NuGet (вроде выбирал MySQL.ConnectNET.Enity) - эффект такой же.

Всё-таки, как по-человечески заставить работать приложение работать, не прибегая к дополнительной установки MySQL Connector 6.8.3?

Извиняюсь за обилие текста, просто я новичок в EF, может, на каком-то шаге я допустил ошибку, поэтому хотел подробно разъяснить последовательность своих действий.
  • Вопрос задан
  • 4105 просмотров
Подписаться 7 Оценить Комментировать
Решения вопроса 1
Imagio
@Imagio
Турист, мотоциклист и программист
В своем проекте делал вот так:
App.config
<system.data>
    <DbProviderFactories>
      <remove invariant="MySql.Data.MySqlClient" />
      <add
          name="MySQL Data Provider"
          invariant="MySql.Data.MySqlClient"
          description=".Net Framework Data Provider for MySQL"
          type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data, 
                  Version=6.8.3.0, Culture=neutral, 
                  PublicKeyToken=c5687fc88969c44d"
      />
    </DbProviderFactories>
  </system.data>

Ну и MySql.Data.dll + MySql.Data.Entity.dll копировать в выходной каталог при сборке.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@chaek
В настройках проекта Publish -> Prerequisites галками устанавливаются пакеты, которые должны быть установлены в случае их отсутствия перед запуском приложения. Если нужного вам пакета нет, то его можно самостоятельно создать и добавить в перечисленный список (msdn.microsoft.com/en-us/library/ms165429.aspx, archive.msdn.microsoft.com/bmg). Я именно таким способом решал проблему с EF Firebird.
Ответ написан
А положить либу в папку с программой не получится? Думаю для этого достаточно будет установить у референса свойство Copy Local в Copy Always.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы