2012-03-26 56 views
1

我试图将实体框架与适配器结构配合使用,我的目标是让单个.edmx结构能够管理多个连接。具有实体框架的适配器(C#)

我需要有这些适配器:

  • 基于文件的数据库(SqlServerCE 3.5)
  • 的MySQL(从甲骨文其定制提供商)
  • 甲骨文(如MySQL的)
  • 的SqlServer

我有一个DAO类,它接收来自winform的数据连接的bean(依赖注入对象),而不是由于sp在该bean中的ecific信息中,DAO将通过数据库工厂类加载正确的适配器。

我的数据库工厂将加载一个真正的适配器类(例如,用于实现我的抽象适配器类的mysql A_Mysql.cs)。

我特别想明白跳,我可以在适配器修改连接方法:

public override Entities createConnection(DbConnection dbBean) 
    { 
     string conn = 
      @"metadata=res://*/Toolkit.Database.External.ADO.ADODatabase.csdl" + 
      @"|res://*/Toolkit.Database.External.ADO.ADODatabase.ssdl" + 
      @"|res://*/Toolkit.Database.External.ADO.ADODatabase.msl;" + 
      @"provider=MySql.Data.MySqlClient;" + 
      "provider connection string=\"Persist Security Info=True;server=" + dbBean.Server + ";" + 
      "Port=" + dbBean.Port + ";" + 
      "User Id=" + dbBean.Username + ";"+ 
      "Password=" + dbBean.Password + ";" + 
      "database=" + dbBean.Schema + "\""; 

     Entities entities = new Entities(conn); 

     return entities; 
    } 

使用相同的.edmx,在我的DAO ...

我敢肯定,这是正确的方式,不幸的是,这个系统总是返回我从SqlCE的错误(我已经生成了SqlServerCE的第一个.emdx,但它不包含任何有关该数据库的信息,我的App.config文件没有存储数据库信息)...

你能帮助我吗?如有需要,请写信给我以获取更多信息。 谢谢。

回答

0

您的数据访问层将需要在实体提供者级别抽象,而不是数据库连接级别。你基本上是在谈论使用存储库模式。您需要针对您计划支持的每个提供程序拥有单独的上下文,因为这最终负责将您的Linq查询转换为特定数据库平台的正确SQL语法。每个上下文应该实现相同的接口(这是您的存储库接口)。在你的代码中,你所做的一切都是针对该接口,而不是实际的上下文类型。然后使用依赖注入框架(例如Ninject)来管理为您正在使用的数据库提供程序实例化正确的上下文实现。

+0

你能帮我吗?我仍然有一些困难:[这里](http://stackoverflow.com/questions/9903988/modify-ssdl-runtime-for-ado-net-and-entity-framework) – Gian 2012-03-28 13:57:38

0

我有关于如何使用多个数据库[它在西班牙语:)]

Post

问候多个连接上MI网站一个帖子。

0

它不起作用,因为EDMX本身包含有关数据库提供者的信息。存储在EDMX中的整个数据库描述也针对单个数据库提供者。 SQL Server 2005和2008之间甚至有所不同。对于您想要支持的每个数据库,至少需要单独的SSDL部分。

+0

你能帮我吗?我仍然有一些困难:[这里](http://stackoverflow.com/questions/9903988/modify-ssdl-runtime-for-ado-net-and-entity-framework) – Gian 2012-03-28 13:57:13