2011-02-12 52 views
1

我已經實現了處理某種對象的內容管理系統,現在客戶端已經引入了另一種類型的對象,其結構和行爲完全相同,但是分離。他們希望能夠切換模式,其中每個模式的行爲是相同的,除了一個處理一個對象類型而另一個處理另一個。Linq to Entities在運行時控制表名稱解析

假設第一個對象類型存儲在名爲TBL_OBJECT的表中,而第二個名爲TBL_OBJECT_NEW。我正在尋找一種方法來使用我現有的代碼,但能夠實時切換並切換到其他表格。因爲結構是相同的,所以這在概念上是可能的。唯一的問題是,在L2E,表名被保存爲屬性和編譯,所以我在尋找一種方式來掛鉤的SQL語句創建過程,讓我現有的聲明是這樣的:

Dim db as New DataContext 
Dim query = From obj in db.Objects 

將解析爲TBL_OBJECT_NEW表而不是TBL_OBJECT表。如果我能做到這一點,我可以重複使用大量的代碼。我知道這是一個有點不尋常的場景,但我真的希望這是可能的。任何幫助非常感謝!謝謝。

順便說一句,我使用DevArt的LinqConnect來做這件事;我不知道一個簡單的L2E方法會對此適用多少。另一方面,如果您知道如何使用DevArt但不使用L2E,那仍然非常有幫助。

回答

1

我們不知道有兩個相同的表映射到一個概念實體的可能性。

LinqConnect和Entity Framework中都有解決方案。例如,您可以嘗試在僅有一個區別的兩個模型之間切換(第一個模型將映射TBL_OBJECT,第二個模型將TBK_OBJECT_NEW)。

LinqConnect溶液

要與LinqConnect相同的結構不同的表之間切換,可以對當前的DataContext實例創建從它們中的一個2個.lqml文件和負載映射:

string mappingFileName; 
if (...) // Check whether TBL_OBJECT_A should be used 
    mappingFileName = "MyDataContext_A.lqml"; 
else 
    mappingFileName = "MyDataContext_B.lqml"; 
Stream contextStream = System.IO.File.OpenRead(mappingFileName); 
System.Data.Linq.Mapping.MappingSource mappingSource = 
Devart.Data.Linq.Mapping.XmlMappingSource.FromStream(contextStream); 
MyDataContext context = new MyDataContext(connectionString, mappingSource); 

此外,我們計劃支持流暢映射(在不使用屬性或映射文件的情況下在代碼中設置映射的方法),但目前無法爲此提供任何時間表。您可以在我們的UserVoice投票支持此功能。

實體框架的解決方案

的元數據集神器處理財產CopyToOutputDirectory。之後,轉到生成的SSDL文件並將表名從「TBL_OBJECT」更改爲「TBL_OBJECT_NEW」。 現在唯一的事情是使用正確的連接字符串創建上下文(您可以將新的連接字符串添加到應用程序配置文件或將整個連接字符串傳遞給構造函數ObjectContext)。

+0

這對我有效,雖然我遇到了一個奇怪的問題,代碼開始給出一個錯誤「找不到提供程序類型」,它以前沒有找到。我能夠通過在DevArt dll上將CopyLocal設置爲True來解決此問題。不知道爲什麼它無法使用這種方法在GAC中找到它們,但可以使用其他方法。我還發現保留lqml文件的一個副本並實時翻轉表名是比較方便的,而不是保留兩個單獨的副本。無論如何,我很高興能夠做到我所需要的相對簡單。謝謝。 – 2011-02-15 13:43:12