Решил поближе познакомиться с миром EF. Так как я для работы использую MySql, то на нём и проводил все эксперименты. Для последовательности мыслей вот базовый необходимый список шагов, которые я выполняю для создания тестового примера:
1. Программная начинка машины: Windows 8.1 Pro, VS2013, MySQL Connector 6.8.3, MySQL for VS 1.2
2. Создаю в VS консольное приложение на языке C#
3. В проект добавляю новый элемент:
4. Выбираем нужную модель:
5. Выбираем (или создаем новое, если его нету) соединение:
6. Выбираем версию EF 5.0 (хотя особых вариантов нету):
7. Для простоты эксперимента выберем одну таблицу:
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="server=192.168.0.37;user id=root;password=blablabla;persistsecurityinfo=True;database=testbase""
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. Запускаем. Всё прекрасно работает.
11. Теперь открываем свойства проекта, на вкладке Signing создаем тестовый сертификат, подписываем манифест.
12. На вкладке Publish взглянем на файлы, которые идут в итоговый проект:
13. Публикуем всё это дело куда-нибудь
14. На всякий случай проверяем опять, всё ли работает? Запустим ConsoleApplication1.application, развертывание проходит успешно. Приложение без проблем показало количество записей в нашей таблице как в предыдущем примере.
Вроде бы всё прекрасно, но если теперь запустить ConsoleApplication1.application на другой машине, не девелоперской, то мы получим сообщение об ошибке - указанный поставщик хранилища не найден в конфигурации или недопустим.
Опытным путем было установлено, что приложение не может погрузить MySql.Data.MySqlClient из GAC. Если на клиентскую машину установить MySQL Connector 6.8.3, то проблема исчезает. Этим решением можно было бы воспользоваться, если бы его пришлось проделать пару-тройку раз, но в реальности приложение должно будет работать примерно 70-80 компьютерах, не набегаешься( К тому же запуск инсталлера требует админских прав.
Также я пробовал создать приложение с использованием EF6 из NuGet (вроде выбирал MySQL.ConnectNET.Enity) - эффект такой же.
Всё-таки, как по-человечески заставить работать приложение работать, не прибегая к дополнительной установки MySQL Connector 6.8.3?
Извиняюсь за обилие текста, просто я новичок в EF, может, на каком-то шаге я допустил ошибку, поэтому хотел подробно разъяснить последовательность своих действий.