我正在实现一个导入工具,它从文件中读取数据并将它们存储到数据库中。我们有两个不同版本的数据库:“完整版”和“轻量级”版本。轻量级版本有一个表少,另外四个表引用缺少的表也没有这个外键列。
我已经实现了使用Linq-to-Sql将数据导入“完整”数据库的工具,我想重新使用逻辑导入数据库的轻量级版本。
我的想法是为此目的使用dynamic
个对象。
所以我在项目中添加了两个不同的Linq-To-SQL .dbml
文件,并用相应的表填充它们。我将它们设置为使用不同的命名空间以避免名称冲突。
我没有问题来初始化动态变量的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#是静态类型的,但我没有看到任何其他方法来重用我的代码...
答案 0 :(得分: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;