代码改变世界

ADO.NET Entity Framework支持多Provider

2008-12-02 16:39 灵感之源 阅读(...) 评论(...) 编辑 收藏

前言

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