如何为多种类型的数据库使用单个ObjectContext?

时间:2011-08-15 19:56:24

标签: c# entity-framework

我正在努力为特定的实体框架问题找到正确,准确或解释良好的文档,但我正在开发一个支持多种类型数据库的应用程序。最初它是基于DLinq构建的,但现在我们正在增加支持。我们已经尝试开发我们自己的系统,但它很慢,IQToolkit,现在实体。

我的问题是,您如何使用单个ObjectContext来支持多种类型的数据库?在最初使用DLinq的构建中,整个地方都有DatabaseContext实例作为每个事务项。当我们尝试IQToolkit时,我们能够将调用抽象到我们的静态Shell类中,该类可以执行'Shell.Database.DoSomething',其中'Shell.Database'是一个与数据库无关的对象,它不关心它正在与哪个数据库通信,框架完成了所有工作。现在我们正在尝试学习实体框架以获得更好的解决方案,但我不想做的是在应用程序中的任何地方都有代码,必须根据配置的数据库实例化不同的上下文。有一个抽象的对象可以很容易地完成它,因此只有一个对象用于数据库工作,我认为这是ObjectContext的要点。但是,我们遇到了一些小问题。

为了补救我们的学习,我有一个测试项目,通过一个简单的Customers表来学习实体:

enter image description here

正如您所看到的,我使用的是一个定义模式的EDMX模型,并且每个数据库类型都有单独的元数据文件。 最初EDMX是通过选择现有MySQL数据库创建的 Northwind的MSSQL版本具有相同的模式,除了MySQL模式使用varchar(36)作为GUID,因为MySQL中没有Guid原语。我实例化的方式如下:

private static void InitMySql() {
    MySqlConnectionStringBuilder builder1 = new MySqlConnectionStringBuilder();
    builder1.Server = "win-x58";
    builder1.Database = "Northwind";
    builder1.UserID = "root";
    builder1.Password = "<password>";

    EntityConnectionStringBuilder builder2 = new EntityConnectionStringBuilder();
    builder2.Metadata = @".\Metadata\MySQL\";
    builder2.Provider = "MySql.Data.MySqlClient";
    builder2.ProviderConnectionString = builder1.ToString();

    m_Context = new NorthwindObjectContext(builder2.ToString());
}

private static void InitMSSql() {
    SqlConnectionStringBuilder builder1 = new SqlConnectionStringBuilder();
    builder1.DataSource = "win-x58";
    builder1.InitialCatalog = "Northwind";
    builder1.IntegratedSecurity = true;

    EntityConnectionStringBuilder builder2 = new EntityConnectionStringBuilder();
    builder2.Metadata = @".\Metadata\MSSQL\";
    builder2.Provider = "System.Data.SqlClient";
    builder2.ProviderConnectionString = builder1.ToString();

    m_Context = new NorthwindObjectContext(builder2.ToString());
}

现在MySQL连接,并且工作正常。我可以查询数据库并查看结果。但是,当我尝试使用此代码使用MSSQL连接字符串实例化时执行此操作:

foreach (Customer item in m_Context.Customers) {
    Console.Out.WriteLine(item.Name);
}

我得到以下异常:

MetadataException
Schema specified is not valid. Errors: 
Entities.ssdl(10,6) : error 0040: The Type guid is not qualified 
with a namespace or alias. Only PrimitiveTypes can be used without qualification.

MSSQL的SSDL是:

<?xml version="1.0" encoding="utf-8"?>
<Schema Namespace="northwindModel.Store" Alias="Self" Provider="System.Data.SqlClient" ProviderManifestToken="2008" xmlns:store="http://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator" xmlns="http://schemas.microsoft.com/ado/2009/02/edm/ssdl">
  <EntityContainer Name="northwindModelStoreContainer">
    <EntitySet Name="Customers" EntityType="northwindModel.Store.Customers" store:Type="Tables" Schema="northwind" />
  </EntityContainer>
  <EntityType Name="Customers">
    <Key>
      <PropertyRef Name="ID" />
    </Key>
    <Property Name="ID" Type="guid" Nullable="false" />
    <Property Name="Name" Type="varchar" MaxLength="45" />
    <Property Name="Email" Type="varchar" MaxLength="45" />
    <Property Name="Phone" Type="varchar" MaxLength="12" />
  </EntityType>
</Schema>

所以,也许我不太了解EF。我真的可以使用一些好的方向来尝试解决所有这些设计和代码问题。我知道这很长很可能是主观的,但我不确定我的问题的一部分是否有效,因为我们对EF的经验是如此之少,而且我已经找到了很好的答案而且它们不完整,含糊不清或不存在

1 个答案:

答案 0 :(得分:2)

Guid SQL Server数据库类型;因此错误。

SQL Server用语中的Guid是uniqueidentifier