Показаны сообщения с ярлыком Visual Studio. Показать все сообщения
Показаны сообщения с ярлыком Visual Studio. Показать все сообщения

вторник, 8 декабря 2015 г.

Firebird Entity Framework 6 - DbContext

Добрый день.
Сегодня я вам расскажу как в свои проекты добавить поддержку Firebird через Entity Framework 6,

Для начала вам нужно скачать мою утилиту, которая прописывает библиотеки Firebird в Visual Studio 2015. Установите утилиту.



После установки, запускайте Visual Studio 2015 и создавайте новый проект Window Forms.


Добавьте ссылки на сборки Firebird в ваш проект.


Укажите файлы из той папки, в которую была установлена утилита.


Вы должны добавить 2 файла в ваш проект:
EntityFramework.Firebird.dll
FirebirdSql.Data.FirebirdClient.dll


Теперь нужно добавить пакет Nuget - EntityFramework




В итоге в вашем проекте должны быть такие сборки:


Теперь откройте файл app.config и закоментируйте все внутри тега <entityFramework>
И добавьте следующий текст:

    <defaultConnectionFactory type="FirebirdSql.Data.EntityFramework6.FbConnectionFactory, EntityFramework.Firebird" />
    <providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
      <provider invariantName="FirebirdSql.Data.FirebirdClient" type="FirebirdSql.Data.EntityFramework6.FbProviderServices, EntityFramework.Firebird" />
    </providers>

Должно получиться примерно как на картинке:

Сохраните и закройте файл.
Добавьте в проект новый элемент Модель EDM.


Выбираем Конструктор из базы данных


Нажимайте "Изменить"


Выбирайте Firebird Data Source


Указывайте параметры подключения к вашей базе данных.


Нажимайте точку и потом кнопку Далее.


Выбирайте таблицы, которые нужно загрузить в модель.


Поставьте флажок и нажмите ОК, иначе замучает.


Модель создана.


Как именно пользоваться моделью, я надеюсь рассказывать не надо. Или можно почитать об этом в сетях.

Надеюсь вы сможете оценить мою утилиту и данную статью.
Спасибо.

воскресенье, 29 ноября 2015 г.

Разработка приложения Silverlight с доступом к базе данных через Entity Framework 6 (DbContext)

В этой статье я бы хотел рассказать о том, как создать приложение Silverlight 5 и заставить его работать с DbContext. Данный опыт мне дался достаточно большими усилиями, т.к. организация доступа в Silverlight сильно усложнена, особенно через DbContext.

Создаем новое приложение Silverlight


Включим поддержку WCF RIA Services


На WEB проекте добавим новые сборки NuGet



Добавим пакет Entity Framework.
На данный момент актуальная версия 6.1.3


В строке поиска введем OpenRIA Server и добавим пакет в проект


Т.к. мы планируем использовать Entity framework 6 (DBContext) нужно добавить пакет OpernRIA DBContext


Добавим модель Entity


Выберем модель и нажмем OK


Укажем параметры подключения к вашей базе данных



Для примера я добавлю всего две таблицы в модель



Нажмите F6 чтобы построить проект
Далее выберите Сервис - Расширения и обновления, слева выберите пункт "В сети"
В строке поиска введите Open RIA


Нажмите кнопку "Загрузить"
После установки пакета перезапустите Visual Studio
В корень проекта Web добавьте папку Services
На этой папке нажмите правой кнопкой и выберите "Создать элемент"
Слева выберите "Веб" и найдите пункт "DomainService"


Поставьте галочки на ваших сущностях, которые вы хотите добавить, для того, чтобы были сгенерированы классы для редактирования, поставьте галочку "Enable editing".



В открывшемся файле закомментируйте строку System.Data


Нажмите F6 чтобы построить проект.
Добавим новый метод GetByUsersByName, который будет возвращать пользователя по его логину. После имени таблицы добавьте Include("UsersDomainLogins"). Это позволит загружать связанные элементы UserDomainLogins при загрузке сущности User.


Откроем файл DomainService1.metadata.cs, найдем там класс Users и свойство  UsersDomainLogins. Добавим атрибут [Include] к этому полю. Это позволит загружать связанные элементы UserDomainLogins при загрузке сущности User.


Нажмите F6 чтобы построить проект.
Выгрузите проект SilverlightApplication, нажмите на нем правой кнопкой и выберите "Изменить"


Найдите тег  переименуйте его в .


Сверните все группы, кроме предпоследней, которая содержит слово targets


Откроем папку с вашим проектом, в ней должна быть папка packages.
Откройте ее.


Откройте папку OpenRiaServices.Server, а в ней папку builds


Там должен быть файл targets


Если он есть, тогда добавьте строку:
Import Project="..\packages\OpenRiaServices.Client.CodeGen.4.4.1.0\build\OpenRiaServices.Client.CodeGen.targets" Condition="Exists('..\packages\OpenRiaServices.Client.CodeGen.4.4.1.0\build\OpenRiaServices.Client.CodeGen.targets')"


Эта строка позволит генерировать файлы сущностей на стороне клиента.
Сохраняем файл и перезагружаем проект.
Добавляем в проект Silverlight новый пакет.



Находим пакет OpenRia Client, который помечен как Full client.


Теперь нужно удалить ссылки на сборки:
System.ServiceModel.DomainServices.Client
System.ServiceModel.DomainServices.Client.Web


Перестроим проект
Нажмем кнопку "Показать все файлы" и откроем папку Generated_Code


Это означает, что Open RIA сгенерировал прокси классы наших сущностей на стороне клиента.
Откроем файл Home.cs и добавим в процедуру OnNavigatedTo немного кода.


Добавим код для загрузки данных с сервера.
И поставим несколько точек останова, чтобы убедиться, что все работает, как мы планировали. Сущность User подгружает связанные сущности UsersDomainLogins.


В данном примере я рассказал, как реализовать работу приложения Silverlight 5 с Entity Framework 5 посредством DbContext и с помощью Open RIA Services.
Данная технология пришла на смену WCF RIA Services которая не поддерживает Entity Framework 6 и даже 5.

На этом раскланиваюсь.

четверг, 4 июля 2013 г.

Размещение WCF библиотеки в службе Windows.

В этой статье хочу рассказать как правильно разместить службу WCF (Windows Communication Foundation) в службе Windows 7.

Создадим новый проект WCF Service Library.

В Solution Explorer находим файл app.config, нажимаем на нем правой кнопкой и выбираем Edit WCF Configuration.

Переходим к пункту Host. Выбираем базовый адрес и нажимаем кнопку "Edit"

И вписываем адрес: net.tcp://localhost:8732/Service1/

Должно выглядеть вот так:

На пункте Binding нажимаем правую кнопку и выбираем New Binding Configuration

Далее выбираем netTcpBinding


Переходим к пункту serviceMetadata и меняем значение HttpGetEnabled на False.

Переходим к пункту Service Endpoint и меняет Binding на netTcpBinding


В BindingConfiguration ставим NewBinding0

Переходим ко второму пункту (Empty Name) и в Binding указываем mexTcpBinding

На этом настройка конфигурации закончена. Нажимаем File - Save.

В проект добавляем службу Windows.

На дизайнере службы нажимаем правую кнопку и добавляем установщик (Add Installer).
 

Выбираем появившийся serviceProcessInstaller1 и меняет Account с User на LocalSystem

Добавляем в проект WindowsService1 ссылку на проект WcfLibraryService (Add reference)
Выбираем serviceInstaller1, переключаемся на вкладку событий, и дважды щелкаем по событию AfterInstall.

Переходим к коду, добавляем using System.Management;
В процедуру serviceInstaller1_AfterInstall вписываем следующий код:

Code Snippet
  1. private void serviceInstaller1_AfterInstall(object sender, InstallEventArgs e)
  2. {
  3.     ConnectionOptions coOptions = new ConnectionOptions();
  4.     coOptions.Impersonation = ImpersonationLevel.Impersonate;
  5.  
  6.     ManagementScope mgmtScope = new System.Management.ManagementScope(@"root\CIMV2", coOptions);
  7.     mgmtScope.Connect();
  8.  
  9.     using (ManagementObject wmiService = new ManagementObject("Win32_Service.Name='" + serviceInstaller1.ServiceName + "'"))
  10.     {
  11.         ManagementBaseObject InParam = wmiService.GetMethodParameters("Change");
  12.         InParam["DesktopInteract"] = true;
  13.         wmiService.InvokeMethod("Change", InParam, null);
  14.     }
  15. }

Это действие позволит службе взаимодействовать с рабочим столом пользователя.
Хотя в Windows 7 это уже не актуально. И только добавляем больше проблем.

Весь код файла выглядит так:

Code Snippet
  1. using System.ComponentModel;
  2. using System.Configuration.Install;
  3. using System.Management;
  4.  
  5.  
  6. namespace WindowsService1
  7. {
  8.     [RunInstaller(true)]
  9.     public partial class ProjectInstaller : System.Configuration.Install.Installer
  10.     {
  11.         public ProjectInstaller()
  12.         {
  13.             InitializeComponent();
  14.         }
  15.  
  16.         private void serviceInstaller1_AfterInstall(object sender, InstallEventArgs e)
  17.         {
  18.             ConnectionOptions coOptions = new ConnectionOptions();
  19.             coOptions.Impersonation = ImpersonationLevel.Impersonate;
  20.  
  21.             ManagementScope mgmtScope = new System.Management.ManagementScope(@"root\CIMV2", coOptions);
  22.             mgmtScope.Connect();
  23.  
  24.             using (ManagementObject wmiService = new ManagementObject("Win32_Service.Name='" + serviceInstaller1.ServiceName + "'"))
  25.             {
  26.                 ManagementBaseObject InParam = wmiService.GetMethodParameters("Change");
  27.                 InParam["DesktopInteract"] = true;
  28.                 wmiService.InvokeMethod("Change", InParam, null);
  29.             }
  30.         }
  31.     }
  32. }

В свойствах проекта WcfServiceLibrary на последней вкладке снимаем галочку Start WCF Service Host.

Копируем файл app.config в проекте WcfServiceLibrary

Этот файл нужно вставить в проект WindowsService

Идея такая, что файл app.config должен быть одинаковый в этих двух проектах.
Потому что служба WCF будет вызываться из службы Windows, то в проекте службы Windows должны находиться параметры WCF службы. Эти параметры служба Windows (WindowsService1) не может достать из файла app.config проекта WcfServiceLibrary.

В проекте WindowsService1 на файле Service1 нажимаем правой кнопкой и выбираем View Code


Добавляем ссылку на сборку System.ServiceModel;
И в коде вписываем using System.ServiceModel;

В процедуре OnStart вписываем код:

Code Snippet
  1. protected override void OnStart(string[] args)
  2. {
  3.     if (myServiceHost != null)
  4.     {
  5.         if (myServiceHost.State == CommunicationState.Opened) myServiceHost.Close();
  6.     }
  7.  
  8.     try
  9.     {
  10.         myServiceHost = new ServiceHost(typeof(WcfServiceLibrary1.Service1));
  11.         myServiceHost.Open();
  12.     }
  13.     catch (Exception ex)
  14.     {
  15.         EventLog.WriteEntry(this.ServiceName, ex.Message);
  16.     }
  17. }

Это позволит службе Windows при запуске запустить хостинг WCF службы
В процедуре OnStop вписываем код:

Code Snippet
  1. protected override void OnStop()
  2. {
  3.     if (myServiceHost != null)
  4.     {
  5.         myServiceHost.Close();
  6.         myServiceHost = null;
  7.     }
  8. }

В итоге общий код файла выглядит так:

Code Snippet
  1. using System;
  2. using System.Diagnostics;
  3. using System.ServiceProcess;
  4. using System.ServiceModel;
  5.  
  6. namespace WindowsService1
  7. {
  8.     public partial class Service1 : ServiceBase
  9.     {
  10.         public Service1()
  11.         {
  12.             InitializeComponent();
  13.         }
  14.         private static ServiceHost myServiceHost = null;
  15.  
  16.         protected override void OnStart(string[] args)
  17.         {
  18.             if (myServiceHost != null)
  19.             {
  20.                 if (myServiceHost.State == CommunicationState.Opened) myServiceHost.Close();
  21.             }
  22.  
  23.             try
  24.             {
  25.                 myServiceHost = new ServiceHost(typeof(WcfServiceLibrary1.Service1));
  26.                 myServiceHost.Open();
  27.             }
  28.             catch (Exception ex)
  29.             {
  30.                 EventLog.WriteEntry(this.ServiceName, ex.Message);
  31.             }
  32.         }
  33.  
  34.         protected override void OnStop()
  35.         {
  36.             if (myServiceHost != null)
  37.             {
  38.                 myServiceHost.Close();
  39.                 myServiceHost = null;
  40.             }
  41.         }
  42.     }
  43. }

Добавляем новый проект Windows Forms. И делаем его запускаемым по-умолчанию (Set as Startup project).
Кидаем на форму кнопку и добавляем ссылку на службу (Add Service Reference)
Нажимаем кнопку Discover и выбираем службу Service1


В обработчик нажатия на кнопку вписываем код:

Code Snippet
  1. private void button1_Click(object sender, EventArgs e)
  2. {
  3.     ServiceReference1.Service1Client myService = new ServiceReference1.Service1Client();
  4.     MessageBox.Show(myService.GetData(123), "My Service");
  5.     myService.Close();
  6. }

Весь файл должен выглядеть так:

Code Snippet
  1. using System;
  2. using System.Windows.Forms;
  3.  
  4. namespace WindowsFormsApplication1
  5. {
  6.     public partial class Form1 : Form
  7.     {
  8.         public Form1()
  9.         {
  10.             InitializeComponent();
  11.         }
  12.  
  13.         private void button1_Click(object sender, EventArgs e)
  14.         {
  15.             ServiceReference1.Service1Client myService = new ServiceReference1.Service1Client();
  16.             MessageBox.Show(myService.GetData(123), "My Service");
  17.             myService.Close();
  18.         }
  19.     }
  20. }

Нажимаем F6 - для компиляции проекта. Ошибок быть не должно.
Открываем папку проекта WindowsService1


В эту папку нужно скопировать файл InstallUtil.exe
Чтобы его найти на вашем компьютере воспользуйтесь поиском.

Создадим файл InstallServiceAndStart.bat со следующим текстом:
InstallUtil.exe WindowsService1.exe
net start Service1

Создадим файл UninstallServiceAndStop.bat со следующим текстом:
net stop Service1
InstallUtil.exe /u WindowsService1.exe

В итоге папка должна выглядеть так:

Если вы используете Windows XP то для запуска/удаления службы можно пользоваться этими BAT файлами. Если же Windows 7 - то нужно сделать так:
В меню найдите пункт Microsoft Visual Studio 2010\Visual Studio tools

В этой папке есть "Open Visual Studio Command Prompt (2010)", нажмите на нем правой кнопкой мыши и выберите "Запуск от имени Администратора". Отобразится та же консоль.
Поменяйте текущую папку.

Для установки и запуска службы скопируйте содержимое файла InstallServiceAndStart.bat и вставьте в это окно и нажмите Enter (для Windows 7). Если в Windows 7 запускать файлы, то после каждого удаления службы Windows придется перезагружать компьютер.
Если у вас Windows XP то можно просто запускать батники.


Служба установлена и запущена.
Теперь нужно запустить приложение WindowsFormsApplication1. Возможно что Visual Studio не позволит запустить отладку, т.к.он не сможет заменить файл WindowsService1.exe потому, что он будет выполняться ОС. Я просто открыл папку и запустил WindowsFormsApplication1.exe


Нажимаем кнопку и через несколько секунд получаем сообщение


Это говорит о том, что наша служба Windows работает.
Если в службу вносите изменения то нужно произвести удаление службы.
Для этого в Windows XP просто запустите UninstallServiceAndStop.bat в Windows 7 нужно найти пункт Microsoft Visual Studio 2010\Visual Studio tools

В этой папке есть "Open Visual Studio Command Prompt (2010)", нажмите на нем правой кнопкой мыши и выберите "Запуск от имени Администратора". Поменяйте текущую папку на папку с файлом WindowsService1.exe. Скопируйте текст из файла