Skip to content

5. Oracle Database Express Edition 11g Sürüm 2 ile vaka çalışması

5.1. Araçların kurulumu

Yüklenecek araçlar şunlardır:

  • SGBD: [http://www.oracle.com/technetwork/products/express-edition/downloads/index.html];
  • bir yönetim aracı: EMS SQL Manager for Oracle Freeware [http://www.sqlmanager.net/fr/products/oracle/manager/download];
  • bir Oracle istemcisi: NET: ODAC 11.2 Sürüm 5 (11.2.0.3.20), Visual Studio için Oracle Geliştirici Araçları ile birlikte: [http://www.oracle.com/technetwork/developer-tools/visual-studio/downloads/index.html].

Aşağıdaki örneklerde, "system" kullanıcısının şifresi "system"dir.

Oracle [1]'i çalıştıralım, ardından SGBD ve [2]'i yönetmek için kullanacağımız [SQL Manager Lite for Oracle] aracını çalıştıralım.

  • [3]'te mevcut bir veritabanına bağlanıyoruz;
  • [4]'te, bağlanmak için Oracle XE hizmetini kullanıyoruz;
  • [5]'te, XE veritabanının adını belirtiriz;
  • [6]'te, system / system olarak bağlanıyoruz;
  • [7]'te sihirbazı sonlandırıyoruz;
  • [8]'te, veritabanına bağlanılır;
  • [9]'te, oturum açılmış olur;
  • geniş yetkilere sahip system / system kullanıcısı olarak bağlandığımız için, örneğin [10] kullanıcılarını yönetebiliriz;
  • [11]'te yeni bir kullanıcı oluşturulur;
  • [12]'e, adı [RDVMEDECINS-EF] olacak;
  • [13]'te, şifresi rdvmedecins olacaktır;
  • [14]'te, kullanıcının oluşturulmasını onaylıyoruz;
  • [15] adımında, kullanıcı oluşturulmuştur;
  • [16]'te, [RDVMEDECINS-EF] kullanıcısı aynı zamanda bir veritabanı şemasıdır;
  • [17]'te, oluşturulan kullanıcının yeterli hakları yoktur. SQL komut dosyası aracılığıyla ona haklar veriyoruz;
  • [18]'te komut dosyası çalıştırılır;
  • [19]'te, [RDVMEDECINS-EF] kimliğiyle oturum açmaya çalışacağız ve bu hesabın neler yapabileceğini göreceğiz. Bunun için önce [EMS Manager]'te yeni bir veritabanı kaydediyoruz;
  • [19]'te, XE hizmeti üzerinden oturum açıyoruz;
  • [20]'te, RDVMEDECINS-EF / rdvmedecins kimliğiyle oturum açıyoruz;
  • [21]'te, oturum açan kullanıcının adını yansıtan bir takma ad verilir;
  • [22]'te, verilen bilgilerle Oracle'a oturum açılır;
  • [22]'te, oturum açma işlemi başarıyla gerçekleştirilir;
  • [23]'te, [RDVMEDECINS-EF] şemasında bir tablo oluşturmaya çalışıyoruz;
  • [24]'te, herhangi bir tablo tanımlanıyor;
  • [25]'te, bu tanım onaylanıyor;
  • [26]'te tablo oluşturuldu. Bu tablo siliniyor;
  • [27]'te, tablo silinmiştir.

Artık yeterli haklara sahip bir kullanıcımız olduğuna göre, varlık tanımlarından [RDVMEDECINS-EF] şemasının tablolarını oluşturacak olan VS 2012 projesini oluşturacağız.

5.2. Varlıklardan veritabanının oluşturulması

İlk olarak, [RdvMedecins-SqlServer-01] proje klasörünü [RdvMedecins-Oracle-01] ve [1] olarak çoğaltıyoruz:

  • [2]'e kopyalıyoruz; VS 2012'de ise [RdvMedecins-SqlServer-01] projesini çözümden siliyoruz;
  • [3]'te proje silinmiştir;
  • [4]'te, başka bir proje daha ekliyoruz. Bu proje, daha önce oluşturduğumuz [RdvMedecins-Oracle-01] klasöründen alınmıştır;
  • [5]'te yüklenen projenin adı [RdvMedecins-SqlServer-01]'tir;
  • [6]'e, adını [RdvMedecins-Oracle-01] olarak değiştiriyoruz
  • [7]'te, çözüme başka bir proje eklenir. Bu proje, daha önce çözümden sildiğimiz projenin [RdvMedecins-SqlServer-01] klasöründen alınır;
  • [8]'te, [RdvMedecins-SqlServer-01] projesi çözüme yeniden eklendi.

[RdvMedecins-Oracle-01] projesi, [RdvMedecins-SqlServer-01] projesiyle aynıdır. Birkaç değişiklik yapmamız gerekiyor. [App.config]'te bağlantı dizesini değiştireceğiz ve [DbProviderFactory]'i her bir SGBD'e uyarlamamız gerekiyor.


<!-- veritabanı bağlantı dizesi -->
  <connectionStrings>
    <add name="monContexte" connectionString="Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=XE)));User Id=RDVMEDECINS-EF;Password=rdvmedecins;" providerName="Oracle.DataAccess.Client" />
  </connectionStrings>
  <!-- fabrika sağlayıcısı -->
  <system.data>
    <DbProviderFactories>
      <remove invariant="Oracle.DataAccess.Client" />
      <add name="Oracle Data Provider for .NET" invariant="Oracle.DataAccess.Client" description="Oracle Data Provider for .NET" type="Oracle.DataAccess.Client.OracleClientFactory, Oracle.DataAccess, Version=4.112.3.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
    </DbProviderFactories>
  </system.data>
  • 3. satır: kullanıcı adı ve şifre;
  • 6-11. satırlar: DbProviderFactory. 9. satır, elimizde olmayan bir DLL [Oracle.DataAccess] dosyasına atıfta bulunuyor. Bunu NuGet ve [1] ile elde edebiliriz:
  • [2]'te, arama alanına oracle anahtar kelimesini yazın;
  • [3]'te, uygun olan [Oracle Data Provider] paketini seçin. Bu, Oracle'ın ADO.NET konektörüdür;
  • [4]'te, referans eklenir;
  • [5]'e, [App.config]'te DLL'in doğru sürümünü girmelisiniz. Bu bilgi, özelliklerinde bulunur.

[Entites.cs] dosyasında, oluşturulacak tabloların şemasını uyarlamak gerekir. Kullanılan şema, tabloların sahibi olan kullanıcının adıdır.


  [Table("MEDECINS", Schema = "RDVMEDECINS-EF")]
  public class Medecin : Personne
  {...}

  [Table("CLIENTS", Schema = "RDVMEDECINS-EF")]
  public class Client : Personne
  {...}

  [Table("RVS", Schema = "RDVMEDECINS-EF")]
  public class Rv
  {...}

  [Table("CRENEAUX", Schema = "RDVMEDECINS-EF")]
  public class Creneau
  {...}

Projenin yürütülmesini yapılandırıyoruz:

  • [1]'te, oluşturulacak derlemeye başka bir ad veriyoruz;
  • [2]'te, varsayılan olarak başka bir ad alanı belirledik;
  • [3]'te, çalıştırılacak programı belirliyoruz.

Bu aşamada derleme hatası yok. [CreateDB_01] programını çalıştıralım. Aşağıdaki istisna ile karşılaşılır:

Exception non gérée : System.Data.MetadataException: Le schéma spécifié n'est pas valide. Erreurs :
(11,6) : erreur 0040: Le type rowversion n'est pas qualifié avec un espace de noms ou un alias. Seuls les types primitifs peuvent être utilisés sans qualification.
(23,6) : erreur 0040: Le type rowversion n'est pas qualifié avec un espace de noms ou un alias. Seuls les types primitifs peuvent être utilisés sans qualification.
(33,6) : erreur 0040: Le type rowversion n'est pas qualifié avec un espace de noms ou un alias. Seuls les types primitifs peuvent être utilisés sans qualification.
(43,6) : erreur 0040: Le type rowversion n'est pas qualifié avec un espace de noms ou un alias. Seuls les types primitifs peuvent être utilisés sans qualification.
   à System.Data.Metadata.Edm.StoreItemCollection.Loader.ThrowOnNonWarningErrors
()
   ...
   à RdvMedecins_01.CreateDB_01.Main(String[] args) dans d:\data\istia-1213\c#\d
vp\Entity Framework\RdvMedecins\RdvMedecins-Oracle-01\CreateDB_01.cs:ligne 15

MySQL ile de aynı hatayı aldığımızı hatırlıyoruz. Bu, varlıkların Timestamp alanının türüyle ilgilidir. Aynı değişikliği yapıyoruz. Varlıklarda, şu üç satırı


    [Column("TIMESTAMP")]
    [Timestamp]
    public byte[] Timestamp { get; set; }

şunlarla değiştiriyoruz:


    [ConcurrencyCheck]
    [Column("VERSIONING")]
    public int? Versioning { get; set; }

Böylece sütunun türü byte[]'den int'e değiştirilir. Hem SQL Server hem de MySQL için, erişim rekabetini yönetmek amacıyla kullanılan tablo sütununa, bir satır eklendiğinde veya değiştirildiğinde her seferinde SGBD'ten bir değer atandığını hatırlayalım. Bundan itibaren, tamsayı türünde bir varlık alanı kullanacağız. SGBD'te, bir satır eklendiğinde veya değiştirildiğinde bu tamsayıyı bir birim artırmak için depolanmış yordamlar kullanacağız.

Dört varlık için de yukarıdaki değişikliği yapıp uygulamayı yeniden çalıştırıyoruz. Bunun üzerine şu hata mesajıyla karşılaşıyoruz:

1
2
3
4
5
6
Exception non gérée : System.Data.DataException: An exception occurred while initializing the database. See the InnerException for details. ---> System.Data.ProviderIncompatibleException: DeleteDatabase n'est pas pris en charge par le fournisseur.
   à System.Data.Common.DbProviderServices.DbDeleteDatabase(DbConnection connection, Nullable`1 commandTimeout, StoreItemCollection storeItemCollection)
   ...
   à System.Data.Entity.Internal.LazyInternalContext.InitializeDatabase()
   à RdvMedecins_01.CreateDB_01.Main(String[] args) dans d:\data\istia-1213\c#\d
vp\Entity Framework\RdvMedecins\RdvMedecins-Oracle-01\CreateDB_01.cs:ligne 15

1. satır, Oracle’ın ADO.NET konektörünün mevcut veritabanını silemediğini gösteriyor. Neler olduğunu hatırlayalım. [CreateDB_01.cs] kodunun içeriği şöyledir:


using System;
using System.Data.Entity;
using RdvMedecins.Models;

namespace RdvMedecins_01
{
  class CreateDB_01
  {
    static void Main(string[] args)
    {
      // veritabanı oluşturuluyor
      Database.SetInitializer(new RdvMedecinsInitializer());
      using (var context = new RdvMedecinsContext())
      {
        context.Database.Initialize(false);
      }
    }
  }
}

15. satır, [RdvMedecinsInitializer] sınıfının (12. satır) yürütülmesini başlatır. Bu sınıf şöyledir:


  public class RdvMedecinsInitializer : DropCreateDatabaseAlways<RdvMedecinsContext>

Bu sınıf, veritabanını silip yeniden oluşturmaya çalışan [DropCreateDatabaseAlways] sınıfından türetilmiştir. Sınıf tanımını şu şekilde değiştiriyoruz:


  public class RdvMedecinsInitializer : CreateDatabaseIfNotExists<RdvMedecinsContext>

Veritabanı, yalnızca mevcut değilse oluşturulur. [CreateDB_01.cs] komutunu yeniden çalıştırdığımızda artık hata oluşmuyor. Ancak [EMS Manager] komutunda, [RDVMEDECINS-EF] veritabanının boş kaldığı görülüyor. EF 5, mevcut bir veritabanı bulduğu için hiçbir işlem yapmamıştır. Bu komut, yalnızca veritabanı mevcut değilse işlem yapar. Bu noktadan itibaren bir döngüye giriyoruz. Nitekim, SGBD'e ait bağlantı dizesi şöyledir:


  <connectionStrings>
    <add name="monContexte" connectionString="Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=XE)));User Id=RDVMEDECINS-EF;Password=rdvmedecins;" providerName="Oracle.DataAccess.Client" />
</connectionStrings>

2. satırda, bağlantı dizesi bir veritabanı adı değil, bir kullanıcı adı kullanıyor. Bu kullanıcının mevcut olması gerekiyor.

Bu durumda, [RDVMEDECINS-EF] veritabanını [EMS Manager for Oracle] aracıyla manuel olarak oluşturmamız gerekiyor. Tüm adımları değil, sadece en önemli olanları açıklayacağız.

Oracle veritabanı şu şekilde olacaktır:

Tablolar

Farklı tablolar, önceki iki örnekte de bu tabloların sahip olduğu birincil ve yabancı anahtarlara sahiptir. Yabancı anahtarlar özellikle ON, DELETE ve CASCADE özniteliklerine sahiptir.

Sıralamalar

Burada Oracle sıraları oluşturulmuştur. Bunlar ardışık sayı üreten generatörlerdir. Toplamda 5 tane vardır: [1].

  • [2]'te, [SEQUENCE_CLIENTS] dizisinin özelliklerini görüyoruz. Bu dizi, 1'den başlayarak çok büyük bir değere kadar 1'er 1'er artan ardışık sayılar üretir.

Tüm diziler aynı model üzerine kurulmuştur.

  • [SEQUENCE_CLIENTS], [CLIENTS] tablosunun birincil anahtarını oluşturmak için kullanılacak;
  • [SEQUENCE_MEDECINS], [MEDECINS] tablosunun birincil anahtarını oluşturmak için kullanılacaktır;
  • [SEQUENCE_CRENEAUX], [CRENEAUX] tablosunun birincil anahtarını oluşturmak için kullanılacaktır;
  • [SEQUENCE_RVS], [RVS] tablosunun birincil anahtarını oluşturmak için kullanılacaktır;
  • [SEQUENCE_VERSIONS], tüm tabloların [VERSIONING] sütunlarındaki değerleri oluşturmak için kullanılacaktır.

Tetikleyiciler

Tetikleyici, bir tabloda bir olay (Ekleme, Değiştirme, Silme) öncesinde veya sonrasında SGBD tarafından yürütülen bir yordamdır. 8 adet [1] tetikleyicimiz bulunmaktadır:

 

[CLIENTS] tablosunun birincil anahtarını dolduran [TRIGGER_PK_CLIENTS] tetikleyicisinin DDL koduna bir göz atalım:

1
2
3
4
5
6
7
8
CREATE TRIGGER "RDVMEDECINS-EF".TRIGGER_PK_CLIENTS
 BEFORE INSERT
 ON "RDVMEDECINS-EF".CLIENTS
REFERENCING NEW AS NEW OLD AS OLD FOR EACH ROW
BEGIN
        SELECT SEQUENCE_CLIENTS.NEXTVAL INTO :new.ID from DUAL;
END;
/
  • 1-5. satırlar: [CLIENTS] tablosundaki her INSERT işlemi öncesinde;
  • 6. satır: [ID] sütunu, [SEQUENCE_CLIENTS] dizisinden bir sonraki değeri alacaktır. Böylece birincil anahtar, dizi tarafından sağlanan ardışık değerlere sahip olacaktır.

[TRIGGER_PK_MEDECINS, TRIGGER_PK_CRENEAUX, TRIGGER_PK_RVS] tetikleyicileri de benzerdir.

[CLIENTS] tablosunun [VERSIONING] sütununu besleyen [TRIGGER_VERSIONS_CLIENTS] tetikleyicisinin DDL koduna bakalım:

CREATE TRIGGER "RDVMEDECINS-EF".TRIGGER_VERSION_CLIENTS
 BEFORE INSERT OR UPDATE
 OF
  VERSIONING
 ON "RDVMEDECINS-EF".CLIENTS
REFERENCING NEW AS NEW OLD AS OLD FOR EACH ROW
BEGIN
        SELECT SEQUENCE_VERSIONS.NEXTVAL INTO :new.VERSIONING from DUAL;
END;
/
  • 1-2. satırlar: [CLIENTS] tablosunda her INSERT veya UPDATE işlemi öncesinde;
  • 8. satır: [VERSIONING] sütunu, [SEQUENCE_VERSIONS] dizisinden bir sonraki değeri alacaktır. Böylece [VERSIONING] sütunu, dizi tarafından sağlanan ardışık değerlere sahip olacaktır.

[TRIGGER_VERSION_MEDECINS, TRIGGER_VERSION_CRENEAUX, TRIGGER_VERSION_RVS] tetikleyicileri de benzerdir. Dört [VERSIONING] sütunu, değerlerini aynı diziden alır.

Oracle veritabanı tablolarını oluşturma komut dosyası [RDVMEDECINS-EF], [RdvMedecins / databases / oracle] klasörüne yerleştirilmiştir. Kullanıcı, tablolarını oluşturmak için bu dosyayı yükleyip çalıştırabilir.

Bu işlem tamamlandıktan sonra, projenin çeşitli programları çalıştırılabilir. Bu programlar, SQL Sunucusu ile elde edilen sonuçların aynısını verir; ancak [ModifyDetachedEntities] programı, MySQL ile çöktüğü aynı nedenden dolayı çöker. Sorun aynı şekilde çözülür. [RdvMedecins-MySQL-01] projesindeki [ModifyDetachedEntities] programını [RdvMedecins-Oracle-01] projesine kopyalamak yeterlidir. Ancak bu durumda yeni bir sorun ortaya çıkar:

1
2
3
4
5
6
7
8
9
1-----------------------------
Client [206,x,x,x,616]
2-----------------------------
Client [206,x,x,y,617]

Exception non gérée : System.Data.Entity.Infrastructure.DbUpdateConcurrencyException: Une instruction de mise à jour, d'insertion ou de suppression dans le magasin a affecté un nombre inattendu de lignes (0). Des entités ont peut-être é modifiées ou supprimées depuis leur chargement. Actualisez les entrées ObjectStateManager. ---> System.Data.OptimisticConcurrencyException: Depoda yapılan bir güncelleme, ekleme veya silme komutu beklenmedik sayıda satırı (0) etkiledi. Varlıklar, yüklendikten sonra değiştirilmiş veya silinmiş olabilir. ObjectStateManager girişlerini yenileyin.
   ...
   à RdvMedecins_01.ModifyDetachedEntities.Main(String[] args) dans d:\data\istia-1213\c#\dvp\Entity Framework\RdvMedecins\RdvMedecins-Oracle-01\ModifyDetachedE
ntities.cs:ligne 56
  • 1-4. satırlar: Ayrılmış istemci başarıyla güncellenmiştir;
  • 6. satır: bilinen bir istisna. Bu, doğru sürüme sahip olmadan bir varlığı değiştirmek istediğimizde karşılaştığımız istisnadır. Oysa burada varlığı değiştirmek değil, silmek istemiştik:

      // bağlam dışı varlık silme
      using (var context = new RdvMedecinsContext())
      {
        // burada yeni bir boş bağlam var
        // client1'i silinmiş durumda bağlama yerleştiriyoruz
        context.Entry(client1).State = EntityState.Deleted;
        // bağlam kaydediliyor
        context.SaveChanges();
}

EF 5, client1'i veritabanından silmeyi reddetti, çünkü client1 (satır 6) aynı sürüme sahip değildi. MySQL ile bu sorunu yaşamamıştık. Farklı SGBD'lere ait ADO.NET konektörleri arasında küçük farklılıklar olduğunu yavaş yavaş fark ediyoruz. Aşağıdaki gibi düzeltme yapıyoruz:


using (var context = new RdvMedecinsContext())
      {
        // burada yeni bir boş bağlam var
        // "client1" öğesini bağlamın içine ekleyip siliyoruz
        context.Clients.Remove(context.Clients.Find(client1.Id));
        // bağlam kaydediliyor
        context.SaveChanges();
      }

ve bu şekilde çalışıyor.

5.3. EF 5'e dayalı çok katmanlı mimari

7. sayfanın 2. paragrafında açıklanan vaka çalışmamıza geri dönüyoruz.

Öncelikle, veri erişim katmanı olan [DAO]'i oluşturacağız. Bunu yapmak için, VS 2012 konsol projesini [RdvMedecins-SqlServer-02]'te [RdvMedecins-Oracle-02] ve [1]'e kopyalıyoruz:

  • [2]'e kopyaladıktan sonra, [RdvMedecins-SqlServer-02] projesini siliyoruz;
  • [3]'e, çözüme mevcut bir proje eklenir. Bu proje, az önce oluşturulan [RdvMedecins-Oracle-02] klasöründen alınır;
  • [4]'te, yeni projenin adı silinen projenin adını taşıyor. Adını değiştireceğiz;
  • [5]'te, projenin adını değiştirdik;
  • [6]'e, bazı özelliklerini değiştiriyoruz, örneğin burada derleme adını;
  • [7] olarak, [Models] klasörü silinip, [RdvMedecins-Oracle-01] projesindeki [Models] klasörü ile değiştiriliyor. Aslında, iki proje de aynı şablonları paylaşıyor.
  • [8]'te, projenin mevcut referansları;
  • [9]'te, NuGet aracı kullanılarak Oracle'ın ADO.NET konektörü eklenmiştir.

[App.config] dosyasında, SQL Sunucu veritabanına ait bilgiler, Oracle veritabanına ait bilgilerle değiştirilir. Bu bilgiler, [RdvMedecins-Oracle-01] projesinin [App.config] dosyasında bulunur:


<!-- veritabanına bağlantı dizesi -->
  <connectionStrings>
    <add name="monContexte" connectionString="Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=XE)));User Id=RDVMEDECINS-EF;Password=rdvmedecins;" providerName="Oracle.DataAccess.Client" />
  </connectionStrings>
  <!-- fabrika sağlayıcısı -->
  <system.data>
    <DbProviderFactories>
      <remove invariant="Oracle.DataAccess.Client" />
      <add name="Oracle Data Provider for .NET" invariant="Oracle.DataAccess.Client" description="Oracle Data Provider for .NET" type="Oracle.DataAccess.Client.OracleClientFactory, Oracle.DataAccess, Version=4.112.3.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
    </DbProviderFactories>
  </system.data>

Spring tarafından yönetilen nesneler de değişmektedir. Şu anda elimizde şunlar bulunmaktadır:


  <!-- Spring yapılandırması -->
  <spring>
    <context>
      <resource uri="config://spring/objects" />
    </context>
    <objects xmlns="http://www.springframework.net">
      <object id="rdvmedecinsDao" type="RdvMedecins.Dao.Dao,RdvMedecins-SqlServer-02" />
    </objects>
</spring>

7. satır, [RdvMedecins-SqlServer-02] projesinin derlemesine atıfta bulunmaktadır. Derleme artık [RdvMedecins-Oracle-02] şeklindedir.

Bu işlem tamamlandıktan sonra, [DAO] katmanının testini çalıştırmaya hazırız. Öncelikle, [RdvMedecins-Oracle-01] projesindeki [Fill] programını kullanarak veritabanını doldurmamız gerekiyor. Test programı başarılı bir şekilde tamamlanıyor.

[RdvMedecins-SqlServer-02] projesinde yapıldığı gibi, bu projenin DLL dosyasını oluşturuyoruz ve projeninprojenin tüm DLL dosyalarını, [RdvMedecins-Oracle-02] içinde oluşturulan [lib] klasörüne topluyoruz. Bunlar, bundan sonra gelecek olan [RdvMedecins-Oracle-03] web projesinin referansları olacaktır.

  

Artık uygulamamızın [ASP.NET] katmanını oluşturmaya hazırız:

[RdvMedecins-SqlServer-03] projesinden başlayacağız. Bu projenin klasörünü [RdvMedecins-Oracle-03] ve [1] olarak çoğaltıyoruz:

  • [2]'e kopyalayacağız; VS 2012 Express for the Web ile [RdvMedecins-Oracle-03] klasöründeki çözümü açacağız;
  • [3]'te hem çözümün adını hem de projenin adını değiştiriyoruz;
  • [4]'te, projenin mevcut referanslarını;
  • [5]'te bunları siliyoruz;
  • [6] olarak değiştirip, bunları az önce [RdvMedecins-Oracle-02] projesinin [lib] klasörüne kaydettiğimiz DLL dosyasına yapılan referanslarla değiştiriyoruz.

Geriye sadece [Web.config] dosyasını değiştirmek kalıyor. Mevcut içeriğini, [RdvMedecins-Oracle-02] projesindeki [App.config] dosyasının içeriğiyle değiştiriyoruz. Bu işlem tamamlandıktan sonra web projesini çalıştırıyoruz. Çalışıyor. Web uygulamasını çalıştırmadan önce veritabanını doldurmayı unutmayalım.