根据参数使用DBML方案之一

本文关键字:方案 DBML 参数 | 更新日期: 2023-09-27 18:24:38

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

还有更多的代码。。。

让它整洁的最好方法是什么?

根据参数使用DBML方案之一

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

问题是,如果你有不同的数据类型,你的编译器将失败,除非你使用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";