Dapper歧义扩展方法

tre*_*nki 9 c# dapper

我正在将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)

但这真的有必要吗?有没有更好的办法?

May*_*zer 8

我在添加 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