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