ADO.NET Entity Framework支持多Provider
2008-12-02 16:39 灵感之源 阅读(6694) 评论(13) 编辑 收藏 举报前言
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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?