我正在努力为特定实体框架问题寻找适当,准确或详细解释的文档,但我正在开发一个支持多种类型数据库的应用程序。最初它是建立在DLinq上的,但现在我们正在增加支持。我们试图开发自己的系统,但它很慢,IQToolkit和现在的实体。如何为多种类型的数据库使用单个ObjectContext?
我的问题是,你如何使用一个ObjectContext来支持多种类型的数据库?在最初使用DLinq的构建中,在每个事务项目上都有DatabaseContext实例化。当我们尝试IQToolkit时,我们能够将调用抽象为我们的可以执行'Shell.Database.DoSomething'的静态Shell类,其中'Shell.Database'是一个与数据库无关的对象,它并不关心它与之交谈的数据库,框架完成了所有的工作。现在我们正在尝试学习Entity Framework以获得更好的解决方案,但是我不想做的事情是在应用程序中的任何地方都有代码,它必须基于配置的数据库实例化不同的上下文。有一个抽象对象可以很容易地完成这个工作,所以只有一个对象用于数据库工作,我认为这是ObjectContext的要点。但是,我们遇到了一些小问题。
为了弥补我们的学习,我有一个测试项目来学习实体用一个简单的客户表所示:
正如你所看到的,我使用的是单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的经验如此之少,而且我已经找到了很好的答案,并且它们不完整,模糊或不存在。
哦,我的误解是* .csdl,* .msl和* .ssdl文件。你的答案和一个小小的摆弄我能够使它与MSSQL和MySQL一起工作。感谢您指出这一点。 –