2011-08-15 71 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一起工作。感謝您指出這一點。 –

相關問題