我正在努力为特定的实体框架问题找到正确,准确或解释良好的文档,但我正在开发一个支持多种类型数据库的应用程序。最初它是基于DLinq构建的,但现在我们正在增加支持。我们已经尝试开发我们自己的系统,但它很慢,IQToolkit,现在实体。
我的问题是,您如何使用单个ObjectContext来支持多种类型的数据库?在最初使用DLinq的构建中,整个地方都有DatabaseContext实例作为每个事务项。当我们尝试IQToolkit时,我们能够将调用抽象到我们的静态Shell类中,该类可以执行'Shell.Database.DoSomething',其中'Shell.Database'是一个与数据库无关的对象,它不关心它正在与哪个数据库通信,框架完成了所有工作。现在我们正在尝试学习实体框架以获得更好的解决方案,但我不想做的是在应用程序中的任何地方都有代码,必须根据配置的数据库实例化不同的上下文。有一个抽象的对象可以很容易地完成它,因此只有一个对象用于数据库工作,我认为这是ObjectContext的要点。但是,我们遇到了一些小问题。
为了补救我们的学习,我有一个测试项目,通过一个简单的Customers表来学习实体:
正如您所看到的,我使用的是一个定义模式的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的经验是如此之少,而且我已经找到了很好的答案而且它们不完整,含糊不清或不存在
答案 0 :(得分:2)
Guid 不 SQL Server数据库类型;因此错误。
SQL Server用语中的Guid是uniqueidentifier