我正在努力爲特定實體框架問題尋找適當,準確或詳細解釋的文檔,但我正在開發一個支持多種類型數據庫的應用程序。最初它是建立在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一起工作。感謝您指出這一點。 –