1

我正在实现一个导入工具,它从文件中读取数据并将它们存储到数据库中。我们有两个不同版本的数据库:“完整”版和“轻量级”版。轻量版少了一个表,另外还有四个引用缺失表的表也没有这个外键列。

我已经实现了使用 Linq-to-Sql 将数据导入“完整”数据库的工具,我想重新使用导入到轻量级数据库版本的逻辑。

我的想法是dynamic为此目的使用对象。

所以我.dbml在我的项目中添加了两个不同的 Linq-To-SQL 文件,并用各自的表填充它们。我将它们设置为使用不同的名称空间以避免名称冲突。

初始化DbContext动态变量的(至少我在这里没有得到任何编译器错误)没有问题:

            bool _usefirstdb; 
            dynamic _db;
            if (_usefirstdb) 
            {
                _db =  new FirstDBDataContext (string.Format(SqlScripts.SqlServerConnectionString, args[1], args[2]));
            }
            else
            {
                _db =  new SecondDBDataContext(string.Format(SqlScripts.SqlServerConnectionString,args[1], args[2]));
            }

但我在针对这些对象运行 LINQ 查询时遇到问题:

      var query = from inst in _db.Instances
                  where inst.Name.Equals(args[3])
                  select inst.Id;

这是因为inst编译器无法确定的类型(并且不是dynamic)。

有没有办法克服这个问题?我知道 C# 是静态类型的,但我没有看到任何其他方式来重用我的代码......

4

1 回答 1

1

当您的两个 DbContext 类实现相同的接口时,您可以将引用作为该接口。在您的界面中,您保留两个上下文都具有的 DbSet。然后,当您使用 linq 时,您只能查询这些集合,并且它仍然是类型安全的。

像这样:

public interface IInstances
{
    DbSet<Instance> Instances { get; }
}

public FirstDBDataContext :DbContext, IInstances
{
    //Normal implementation
}

public SecondDBDataContext :DbContext, IInstances
{
    //Normal implementation
}

bool _usefirstdb; 
IInstances _db;
if (_usefirstdb) 
{
    _db =  new FirstDBDataContext (string.Format(SqlScripts.SqlServerConnectionString, args[1], args[2]));
}
else
{
    _db =  new SecondDBDataContext(string.Format(SqlScripts.SqlServerConnectionString,args[1], args[2]));
}

var query = from inst in _db.Instances
    where inst.Name.Equals(args[3])
    select inst.Id;
于 2013-05-23T16:19:40.657 回答