вторник, 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.

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

четверг, 26 декабря 2013 г.

Реализация асинхронной загрузки FillAsync для DbDataAdapter в .NET Framework 4.5 с помощью async и await

Добрый день.
Не так давно я начал изучать нововведения в .NET Framework 4.5
В частности заинтересовала реализация async и await методов.
Сам постоянно работаю с базами данных, которые загружаю с помощью BackgroundWorker или другого потока, чтобы не блокировать интерфейс пользователя при долгой загрузке.
Но меня расстроило отсутствие встроенной возможности асинхронной загрузки через  DbDataAdapter от которого наследуются адаптеры данных. Метод FillAsync просто отсутствует.

OpenAsync() в DbConnection есть, ReadAsync() в DbDataReader есть, а вот FillAsync() в DbDataAdapter нет. Для меня это оказалось серьезным поводом не обновлять мои проекты, т.к. везде используется Fill в адаптере данных.

Но немного подумав, я решил все таки реализовать такой метод сам.
В итоге я написал расширение для DbDataAdapter.
И хочу рассказать вам как я это сделал.

Добавляем в проект новый класс с любым именем, например StaticData.
Со следующим кодом:

using System.Data;
using System.Data.Common;
using System.Threading.Tasks;

namespace AsyncAwaitTesting1
{
    static class StaticData
    {
        public static async Task FillAsync(this DbDataAdapter da, DataTable ds)
        {
            var t = new Task(() => Load(da, ds));            
            t.Start();
            return await t;
        }

        private static int Load(DbDataAdapter da, DataTable dt)
        {            
            return da.Fill(dt);
        }
    }
}




Допустим в проекте уже имеется набор данных. Перейдем к редактору кода:


Добавим код на на рисунке ниже


Прошу обратить внимание что для примера тут расширен адаптер данных только для одной таблицы Codebranch. По идее это нужно сделать для всех таблиц набора данных.
Еще обратите внимание что пространство имен тут тоже другое.

В итоге верхний код добавляет метод FillAsync для адаптера данных.
Работает это так:
int i = await codebranchTableAdapter1.FillAsync(dynPlatformDataSet1.Codebranch);

А вот сам код обработчика


Теперь, при таком сценарии действия метод Fill выполняется асинхронно, не блокируя UI.
Пока неудобство представляет необходимость вручную добавлять методы FillAsync для каждого типизированного адаптера данных.

Хотелось бы чтобы разработчики, все таки учли это и сами включили метод FillAsync для адаптеров данных в будущих редакциях NET Framework.

Пока что все