Spiga

ADO.NET Entity Framework支持多Provider

2008-12-02 16:39 by 灵感之源, 3829 visits, 收藏, 编辑

前言

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

Add your comment

13 条回复

  1. #1楼 kiler      2008-12-02 16:45
    好久没看到lz的文章了。
     回复 引用 查看   
  2. #2楼[楼主] 灵感之源      2008-12-02 16:47
    @kiler
    没多久,就4年而已。忙新产品的开发,即将发布
     回复 引用 查看   
  3. #3楼 timiil      2008-12-02 17:22
    呵呵,不错。 确实是45nm技术。
     回复 引用 查看   
  4. #4楼 lovecherry      2008-12-02 17:49
    抛开从领域模型生成数据库结构不谈
    好像数据库改了后刷新模型也很麻烦啊
    我改了个关系,重新加载居然变成2个关系了不知道是不是bug

    说实话很失望,没有提供从edmx生成数据库的功能的话
    费劲心机弄好的一套mapping,在数据库结构修改后就只能通过手动方式改了
    如果重新加载一下的,自动生成的mapping达不到要求,又要一番修改

    而且EF为什么没提供类似LINQ TO SQL的SQL LOG功能呢?
     回复 引用 查看   
  5. #5楼[楼主] 灵感之源      2008-12-02 18:07
    @lovecherry
    EF刚起步,需要时间发展完善,跟SL对抗FL一样
     回复 引用 查看   
  6. #6楼 蒋正      2008-12-02 20:11
    哇咔咔,多谢楼主了,好东东啊,最近正在学这个东东
     回复 引用 查看   
  7. #7楼 WisdomQQ      2008-12-02 22:08
    同样可以先有Model再生成DB
     回复 引用 查看   
  8. #8楼 Inrie(洪小军)      2008-12-03 09:29
    真是太久太久没有看到LZ的文章了,今天看到了感觉好亲切!
     回复 引用 查看   
  9. #9楼 wanglin_1[未注册用户]2008-12-16 11:04
    你做过了么?我无法生成:FooMSSQL.csdl、FooMSSQL.msl和FooMSSQL.ssdl这三个文件
     回复 引用   
  10. #10楼 wanglin_1[未注册用户]2008-12-16 11:06
    怎么联系楼主,最近在学习这个问题
     回复 引用   
  11. #11楼[楼主] 灵感之源      2008-12-16 13:08
    @wanglin_1
    1.正常添加ADO.NET Entity Data Model(edmx文件),如FooMSSQL,查看Model属性,元数据项目处理,默认“嵌入输出程序集中”,改为“复制到输出目录”,这样就在输出目录产生了3个文件:FooMSSQL.csdl、FooMSSQL.msl和FooMSSQL.ssdl;

    双击打开edmx文件,点击设计器的空白地方,显示model属性,元数据项目处理,默认“嵌入输出程序集中”,改为“复制到输出目录”,这样就在输出目录产生了3个文件:FooMSSQL.csdl、FooMSSQL.msl和FooMSSQL.ssdl;
     回复 引用 查看   
  12. #12楼 曲滨*銘龘鶽      2008-12-19 00:11
    Oracle 官方 Provider 什么时候出啊?
     回复 引用 查看   
  13. #13楼[楼主] 灵感之源      2008-12-19 10:25
    @曲滨*銘龘鶽
    不知道
     回复 引用 查看