ADO.NET Entity Framework支援多Provider

weixin_34377065發表於2008-12-02

前言

EF跟其它ORM的做法不一樣,其它ORM是先有Model再自動維護資料庫,EF是先有資料庫再自動(目前只能手工重建來達到“重新整理”的目的)維護Model的。相比其它ORM,EF最要命的是目前不“內建”切換Provider的支援。但微軟的開發人員給我們提供了以下思路:

參考程式碼:http://code.msdn.microsoft.com/EFQuerySamples

參考文章:http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=3796966&SiteID=1


具體步驟:

0.前提:各個型別的資料庫結構完全一致

1.正常新增ADO.NET Entity Data Model(edmx檔案),如FooMSSQL,檢視Model屬性,後設資料專案處理,預設“嵌入輸出程式集中”,改為“複製到輸出目錄”,這樣就在輸出目錄產生了3個檔案:FooMSSQL.csdl、FooMSSQL.msl和FooMSSQL.ssdl;

2.如此類推,建立各個型別的資料庫模型,如FooOracle、FooSQLite等;

3.對於各個不同型別的資料庫,csdl、msl這2種檔案的內容是一致的,差異就在於ssdl檔案(特定資料庫結構描述);

4.把Foo.Designer.cs程式碼改名為Entities.cs(名稱可隨便改)並複製到任意目錄,如Schemas,同樣複製csdl、msl(只需要一個資料庫的),最終該目錄應該有這些檔案:
 a.Entities.cs
 b.Foo.csdl
 c.Foo.msl
 d.FooMSSQL.ssdl
 e.FooOracle.ssdl
 
5.修改ssdl檔案中的Provider和ProviderManifestToken屬性為實際的值;
 
6.從專案中排除之前新增的資料庫模型檔案(*.edmx);

7.把Entities.cs包括進來,並選擇Foo.csdl、Foo.msl、FooMSSQL.ssdl、FooOracle.ssdl的屬性為複製到輸出目錄;

8.在App.config/Web.Config新增各個資料庫的Provider支援:在connectionStrings欄位,你會發現之前新增的模型相應的ConnectionString已經存在,我們不應該修改它們,因為如果以後我們修改了資料庫結構,我們需要重新包含這些edmx檔案進來並進行修改;
 你應該複製這些ConnectionString,改名,並且更改csdl、msl、ssdl的路徑,因為之前IDE生成的是輸出到bin目錄,而我們實際用的是Schemas目錄,如在ASP.NET下:
 metadata=~/bin/Oracle.csdl|~/bin/Oracle.ssdl|~/bin/Oracle.msl
 改為:
 metadata=~/bin/Schemas/Foo.csdl|~/bin/Schemas/FooOracle.ssdl|~/bin/Schemas/Foo.msl
 注意csdl和msl檔名已經改變!

9.最終使用:
    public static string ConnectionString = ConfigurationManager.ConnectionStrings[ConfigurationManager.AppSettings["ConnectionString"]].ConnectionString;

    public static Entities GetContext
    {
        get
        {
            Entities ent = new Entities(ConnectionString);
            ent.Connection.Open();
            return ent;
        }
    }

 注意:ConnectionString為剛才在App.config/Web.Config中新增的,推薦在AppSettings中記錄當前使用的Provider的名稱,然後就可以隨時切換


P.S. EF for Oracle
網站:http://code.msdn.microsoft.com/EFOracleProvider
下載執行,Provider自動新增到GAC

相關文章