前言
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