2014-09-25 98 views
0

DBML方案之一,我應該支持的基礎上配置參數數據庫兩個版本的應用程序。 問題是這些數據庫的表中的類型之間存在一些細微的差異。 例如,在舊數據庫中,該字段的類型爲tinyint,現在爲smallint使用取決於參數

當我嘗試使用新的.dbml文件,我得到一個可愛的InvalidCastException試圖選擇什麼時候。

我需要用相同的表和列名,但不同類型的兩種不同的.dbml方案。 我想,以避免重複類似的代碼:

if (newDatabaseVersionFlag) 
{ 
    Data.DatabaseDataContext context = new Data.DatabaseDataContext(connectionString); 
    Data.Something item = context.Somethings.SingleOrDefault(e => e.Id == id); 
    item.Sth = (short)5; 
    item.Sth2 = "sample code"; 
} 
else 
{ 
    Data2.DatabaseDataContext context2 = new Data2.DatabaseDataContext(connectionString); 
    Data2.Something item2 = context2.Somethings.SingleOrDefault(e => e.Id == id); 
    item2.Sth = (byte)5; 
    item2.Sth2 = "sample code"; 
} 

而且還有很多比這更多的代碼...

是什麼讓它整潔的最佳方式?

回答

0

您將最好創建一個代理數據上下文。

的問題是,如果你有不同的數據類型,你的編譯器,除非您使用var

public class UseMeDataContext:System.Data.Linq.DataContext 

{ 
... 
} 


UseMeDataContext db ; 
if (newDatabaseVersionFlag) 
{ 
    db = ((System.Data.Linq.DataContext) new Data.DatabaseContext(connectionString)); 
} 
else 
{ 
    db = ((System.Data.Linq.DataContext) new Data2.DatabaseDataContext(connectionString)); 

} 

db.Something item2 = UseMeContext.Somethings.SingleOrDefault(e => e.Id == id); 
    item2.Sth = (TypeOf(item2.sth))5; // May or May not Need typing 
    item2.Sth2 = "sample code"; 
+0

我試圖做同樣的事情,但失敗了'Data.DatabaseContext.Something'來自不同類'Data2.DatabaseContext.Something',所以我不能將它們分配給一個公共變量。我使用的是.NET 3.5,因此這裏沒有'dynamic'關鍵字 – Adassko 2014-09-25 08:31:25

+0

是不同類型的類嗎?他們有 – Traci 2014-09-25 08:34:19

+0

他們如果剛纔編輯我的代碼,以反映System.Data.Linq.DataContext會自動'MSLinqToSQLGenerator'工具 – Adassko 2014-09-25 08:38:42