我正在将Dapper作为ORM解决方案进行测试,并且遇到了某些扩展方法(例如Execute
或)的问题QueryMultiple
:
using (SQLiteConnection con = new SQLiteConnection(GetConnectionString()))
{
con.Open();
string sql = @"
select * from Customer where Id = @id;
select * from Address where CustomerId = @id;";
// QueryMultiple extension ambiguous?
using (var multi = con.QueryMultiple(sql, new { id = 1 }))
{
Customer customer = multi.Read<Customer>().Single();
Address address = multi.Read<Address>().Single();
}
con.Close();
}
Run Code Online (Sandbox Code Playgroud)
我得到错误
在以下方法或属性之间的调用是模棱两可的:'Dapper.SqlMapper.QueryMultiple(System.Data.IDbConnection,字符串,对象,System.Data.IDbTransaction,int ?, System.Data.CommandType?)'和'Dapper.SqlMapper .QueryMultiple(System.Data.IDbConnection,string,dynamic,System.Data.IDbTransaction,int ?, System.Data.CommandType?)'
而且不知道如何正确解决这个问题。Dapper的例子没有提到这样的问题,只是使用了QueryMultiple
。我能够使用以下方式避免歧义
var multi = con.QueryMultiple(new CommandDefinition(sql, new { id = 1 }))
Run Code Online (Sandbox Code Playgroud)
但这真的有必要吗?有没有更好的办法?
我在添加 package 后遇到了同样的问题MiniProfiler.Providers.SqlServer
,这取决于Dapper.StrongName
包,取决于Dapper
.
显然我不想使用已经引用的 MiniProfiler 包,因为拥有控制权总是更好,比如在发布新版本时更新它。
解决程序集之间不明确代码的解决方案是为extern alias
至少一个程序集包分配一个名称,因此当您想要引用其中之一时,您可以使用alias name
.
这是对我有用的解决方案:
为了给alias name
assembly Dapper.StrongName
,我在我的.csproj
文件中添加了以下内容:
<Target Name="StrongNameAlias" BeforeTargets="FindReferenceAssembliesForReferences;ResolveReferences">
<ItemGroup>
<ReferencePath Condition="'%(FileName)' == 'Dapper.StrongName'">
<Aliases>MP_DapperStrongNameAlias</Aliases>
</ReferencePath>
</ItemGroup>
</Target>
Run Code Online (Sandbox Code Playgroud)
然后,如果你想引用它,你可以namespace
通过新添加alies
的.cs
文件引用程序集,使用:: operator
:
using MP_DapperStrongNameAlias::Dapper;
Run Code Online (Sandbox Code Playgroud)
所以现在你可以自由添加了using Dapper;
,它不会再冲突了。
这篇文章可能会有所帮助:C# 2.0:在一个应用程序中使用不同版本的相同 dll