我正在将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 nameassembly 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
| 归档时间: |
|
| 查看次数: |
1337 次 |
| 最近记录: |