Достъп до база данни на Oracle с помощта на Entity Framework - софтуерни продукти
Когато разработвам софтуер, винаги съм се ръководил от едно просто правило: колкото по-малко компоненти, платформи, технологии на трети страни се използват в разработващия се проект, толкова по-добре. Почти всичко гениално е просто. За съжаление, разработчикът не винаги има възможност свободно да избира инструментите и системите, с които работи. Така че получих проекта Windows Forms + ODAC + Oracle DB Server.
Бях много щастлив да науча за пускането на Oracle Data Access Components (ODAC) за Microsoft Entity Framework и LINQ to Entities (Beta2). Чаках този момент и най-накрая той дойде! Не можете да използвате ORM на трета страна - всичко е до ключ.
Как да научите приложение да използва Entity Framework чрез ODAC клиента, инсталиран на крайни машини, е описано в стъпка по стъпка инструкция от Oracle. Кой се интересува как да се отърве от необходимостта да инсталира Oracle клиента на потребителските машини, моля под кат.
Към системата на потребителя: ОС не по-ниска от MS Windows XP SP3 Microsoft .NET Framework 4 По избор
135 MB свободно дисково пространство
Към системата на разработчиците: Visual Studio 2010 Service Pack 1 Oracle Database server 9.2 или по-нова версия ODAC за Microsoft Entity Framework и LINQ to Entities
За да организирате достъпа до базата данни на Oracle, добавете следните библиотеки от пакета ODAC.NET към проекта: Client path library\client_1\odp.net\bin\4\Oracle.DataAccess.dll (
1,4 MB)) свържете се като препратка и задайте свойството „Копиране на локално“ на „вярно“.
Следните файлове просто трябва да бъдат добавени към проекта и свойството "Копиране в изходна директория" да бъде зададено на "Копиране, ако е по-ново": "път на клиента"\client_1\oci.dll (
1 MB) "път къмклиент"\client_1\orannzsbb11.dll (
1,2 MB) "клиентски път"\client_1\bin\OraOps11w.dll (
0,3 MB) "клиентски път"\client_1\oraociei11.dll (
Низът за връзка трябва да е същият като във файла "tnsnames.ora":
Това е достатъчно, за да осигури достъп до базата данни, без да инсталирате клиент на машината на потребителя: private bool TestConnect() опитайте var oracleConnection = new OracleConnection ConnectionString = "Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=ServerNameOrIP)(PORT=PortN) umber)))(CONNECT_DATA=(SERVICE_NAME=DBName))) ;User > >; oracleConnection.Open(); var oracleCommand = new OracleCommand CommandText = "изберете sysdate от dual", Connection = oracleConnection, Transaction = null >; var или acleDataAdapter = нов OracleDataAdapter; var sysDateDataSet = new DataSet("SomeName"); oracleDataAdapter.Fill(sysDateDataSet, "dateTimeTable"); върни sysDateDataSet.Tables[0].Rows.Count > 0; > catch (Пример ception exx) MessageBox.Show(string.Format("Не може да се свърже директно към база данни на Oracle: \n ", exx.Message)); return; > * Този изходен код беше маркиран с инструмента за открояване на изходния код.
Какво трябва да се направи, за да се използва Entity Framework Model без инсталиране на клиента на Oracle
Създайте или свой собствен ADO.NET Entity Data Model, или както в примера - "HRModel" с контекста "HREntities". За да направите това, трябва да използвате съветника за добавяне, както е показано в ръководството от Oracle, споменато по-горе.
Конфигурационният файл на проекта (App.Config/Web.Config) автоматично (ако изберете този съответен елемент в съветника) ще добави низ за връзка с база данни на Oracle:
Тук си струва да се обърне специално вниманиече стойността, присвоена на атрибута "низ за свързване на доставчик", трябва да бъде в двойни кавички (кодът &_q_u_o_t трябва да се използва за обозначаването им). Това също трябва да се вземе предвид при динамичното генериране на низа за връзка.
След това в конфигурационния файл на проекта трябва да създадете раздел, в който добавяме нашия доставчик на данни към вече регистрираните в системата, чийто списък се намира във файла "%windir%\Microsoft.NET\Framework\v4.0.30319\Config\machine.config". Ако ODAC е инсталиран на машината, тогава доставчикът "Oracle.DataAccess.Client" вече ще бъде регистриран в конфигурационния файл на системата и опитът за добавяне на нашия доставчик ще доведе до грешка при стартиране на приложението: "Възникна грешка при създаването на манипулатора на конфигурационната секция за system.data: Колоната 'InvariantName' е ограничена да бъде уникална. Стойността 'Oracle.DataAccess.Client' вече присъства".
За да предотвратите тази ситуация, като използвате етикета , доставчикът „Oracle.DataAccess.Client“ ще бъде премахнат от списъка с доставчици на данни, ако има такъв. След това добавяме нашия доставчик. Той ще бъде добавен към списъка с доставчици на EntityClient, регистрирани в системата:
При динамично свързване на модела към базата данни с помощта на "правилния" метод от MS трябва да се обърне внимание на не съвсем правилното формиране на низа за връзка чрез обекта EntityConnectionStringBuilder string prov; низ dataSourse = (DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=ServerNameOrIP)(PORT=PortNumber)))(CONNECT_DATA=(SERVICE_NAME=DBName)));Потребител > var sqlBuilder = нов SqlConnectionStringBuilder DataSource = dataSourse >; проверка на низ> var entityBuilder = нов EntityConnectionStringBuilder Prov > Prov > метаданни= @"res://*/HRModel.csdl/res://*/HRModel.ssdl/res://*/HRModel.msl" >; използване на (var conn = new EntityConnection(entityBuilder.ToString())) conn.Open(); Console.WriteLine("Просто тествам връзката."); conn.Close(); >
* Този изходен код беше маркиран с инструмента за открояване на изходния код.
В резултат на това entityBuilder.ToString() ще върне низ за връзка с допълнителни единични кавички, който обхваща цялата стойност на низа за връзка на доставчика на атрибут metadata=…;prov '
Докато доставчикът на Oracle изисква низ за свързване в следния формат: metadata=…;prov
- в противен случай дава грешка. Засега можете да формирате грозния низ за свързване: private bool DynamicConnect() const string prov ; const string serverName = "(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=ServerNameOrIP)(PORT=PortNumber)))(CONNECT_DATA=(SERVICE_NAME=DBName)));User > const string metadata = "metadata=res://*/HRModel.csdl/res://*/HRModel. ssdl/res://*/ HRModel.msl"; var entBild = string.Format("metadata=;prov, metadata, providerName, serverName); опитайте var conn = new EntityConnection(entBild); conn.Open(); var hrEntities = new HREntities(conn); var tmpResult = hrEntities.BRIDGE.Count(); conn.Close(); връща истина; > catch (Изключение exx) MessageBox.Show(string.Format("Не може да се свърже директно към база данни на Oracle: \n ", exx.Message)); връща невярно; > >
* Този изходен код беше маркиран с инструмента за открояване на изходния код.
Може би това са ехо от бета версията - нека да видим как ще бъде в изданието, което, както Oracle обещава, ще се проведе през четвъртото тримесечие на 2011 г.
В резултат на това можете да пишете в актива:
Директна връзка на .NET Entity Framework с Oracle DBMSDB Server, без използването на разработки на трети страни Отърваване от инсталирането на клиент към Oracle DB Server на потребителски работни станции Внедряване на .NET приложения, използващи Oracle DBMS с помощта на ClickOnce технология, без предоставяне на администраторски права на крайния потребител (това беше основната ми задача).