Entity Framework и Oracle

Некоторое время назад вышла бета-версия провайдера ODP.NET с поддержкой Entity Framework (пока только 32-битная). Скачать провайдер можно на официальном сайте. Устанавливать ODP.NET нужно вместе с Oracle Developers Tools for Visual Studio (просто оставьте при установке выбранными все галочки, которые там стоят по умолчанию). Чтобы собрать простой проект и проверить работу провайдера в действии, понадобится рабочая база Oracle. Если под рукой нет тестовой базы, можно поставить и настроить Express-версию Oracle на своем обычном рабочем компьютере.

Создаем проект и подключаемся к серверу

После установки ODAC первым делом, конечно, нужно настроить файл TNSNAMES.ORA. Проще всего взять пустую болванку, которая после установки будет лежать в папке %ORACLE_HOME%/Network/Admin/Sample/tnsnames.ora, подправить и переместить на одну папку вверх (в Network/Admin). Выглядеть этот файл будет примерно так:

SANDBOX=
  (DESCRIPTION=
    (ADDRESS=
      (PROTOCOL=TCP)
      (HOST=192.168.xxx.xxx)
      (PORT=1521)
    )
    (CONNECT_DATA=
      (SID=xxxx)
    )
  )

Дальше запускаем Visual Studio 2010 и создаем проект Windows Forms-приложения:

New Project

В окне Server Explorer создаем новое соединение, указывая в качестве Data Source Name имя соединения из файла TNSNAMES.ORA.

Data Source

Add Connection

Здесь все как обычно, можно создавать/изменять таблицы, вьюшки, последовательности и прочие объекты БД. Я подключался к старой схеме, поэтому у меня уже были созданы таблицы AGENTS и USERS. Переименовывать их я не стал, чтобы продемонстрировать работу Entity Framework с классами, имена которых не совпадают с именами физических таблиц (классы будут называться Agent и User соответственно).

Server Explorer

Импортируем и настраиваем схему

Добавляем модель Entity Data Model, генерируем классы из схемы БД (выбираем нужные таблицы, указываем пространство имен для модели и все прочее):

New Model

Generate from Database

Choose Data Connection

Choose Database Objects

Переименовываем классы модели, которые нас не устраивают: AGENTS -> Agent, USERS -> User. Колонки тоже переименовываются: AGENT_ID -> AgentID, и так далее.

Model Designer

Выполняем LINQ-запросы

Схема готова. Чтобы выполнить запрос к ней, нарисуем простое окошко:

Sample Form

Вот запрос, который будет выполняться:

using (var ctx = new Entities())
{
  var query =
    from u in ctx.Users
    where u.Name.StartsWith("ya")
    select u;
 
  foreach (var u in query)
  {
    var msg = string.Format("{0} → {1}", u.Name, u.Agent.Name);
 
    TextBox.AppendText(msg);
    TextBox.AppendText(Environment.NewLine);
  }
}

Вот так будет выглядеть результат:

Results

Leave a Reply