C# 根据参数使用一种DBML方案

C# 根据参数使用一种DBML方案,c#,linq-to-sql,C#,Linq To Sql,我有一个应用程序,它应该支持基于配置参数的两个版本的数据库。 问题是这些数据库的表中的类型之间存在一些细微的差异。 例如,在旧数据库上,字段的类型是tinyint,现在是smallint 当我尝试使用新的.dbml文件时,当我尝试选择任何内容时,会得到一个可爱的InvalidCastException 我需要两个不同的.dbml方案,它们的表和列名相同,但类型不同。 我希望避免重复代码,如: if (newDatabaseVersionFlag) { Data.DatabaseDataC

我有一个应用程序,它应该支持基于配置参数的两个版本的数据库。 问题是这些数据库的表中的类型之间存在一些细微的差异。 例如,在旧数据库上,字段的类型是
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";
}
还有比这更多的代码


使其整洁的最佳方法是什么?

您最好创建一个代理数据上下文

问题是如果您有不同的数据类型,除非您使用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";

我试图做一些类似的事情,但是
Data.DatabaseContext.something
Data2.DatabaseContext.something
是不同的类,因此我无法将它们分配给公共变量。我使用的是.NET3.5,所以没有
动态
关键字。这里有不同类型的类吗?它们是否有共同的父类型它们是由
MSLinqToSQLGenerator
tool如果刚刚编辑了我的代码以反映System.Data.Linq.DataContext自动生成的。这应该可以工作,因为对象具有相同的基本数据类型,而不是因为
System.Data.Linq.DataContext
中没有
Somethings