2011-08-15 29 views
2

我正在努力为特定实体框架问题寻找适当,准确或详细解释的文档,但我正在开发一个支持多种类型数据库的应用程序。最初它是建立在DLinq上的,但现在我们正在增加支持。我们试图开发自己的系统,但它很慢,IQToolkit和现在的实体。如何为多种类型的数据库使用单个ObjectContext?

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

为了弥补我们的学习,我有一个测试项目来学习实体用一个简单的客户表所示:

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. 

的SSDL对于MSSQL是:

<?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的经验如此之少,而且我已经找到了很好的答案,并且它们不完整,模糊或不存在。

回答

2

Guid是不是一个SQL Server数据库类型;因此错误。

一个GUID在SQL Server中的说法是uniqueidentifier

+0

哦,我的误解是* .csdl,* .msl和* .ssdl文件。你的答案和一个小小的摆弄我能够使它与MSSQL和MySQL一起工作。感谢您指出这一点。 –

相关问题