Dapper模糊扩展方法

11

我正在将Dapper作为ORM解决方案进行测试,但遇到了一些扩展方法的问题,比如ExecuteQueryMultiple

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();
}

我遇到了错误:

在以下方法或属性之间的调用不明确: 'Dapper.SqlMapper.QueryMultiple(System.Data.IDbConnection, string, object, 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 }))

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


2
我不明白那个编译器错误。但是我只有一个带有以下参数的QueryMultiple重载方法:IDbConnection cnn, string sql, dynamic param = null, IDbTransaction transaction = null, int? commandTimeout = null, CommandType? commandType = null - Tim Schmelter
1
@TimSchmelter 看起来可能是引用多个DLL的问题?Dapper不应该能够使用dynamic指定重载..至少就我尝试而言,我在尝试创建这样的重载时会得到编译错误。 - Rob
1
也许。你的解决方案中还有另一个SqlMapper文件吗?在整个项目中搜索QueryMultiple。也许是旧版本。 - Tim Schmelter
1
Dapper中肯定不再有dynamic重载:https://github.com/StackExchange/dapper-dot-net/commit/b87d958314b1a85f52c7ef37b78d3740154b4d04 - Rob
1
这次重新设置相同的项目,但不使用DapperExtensions,现在似乎可以正常工作了。 - trenki
显示剩余2条评论
1个回答

8

我在添加MiniProfiler.Providers.SqlServer包后遇到了同样的问题,该包依赖于Dapper.StrongName包,而该包又依赖于Dapper

enter image description here

显然我不想使用已经引用的MiniProfiler包,因为有控制权总是更好的,例如在发布新版本时更新它。

解决程序集之间代码歧义的方法是给至少一个程序集分配extern alias名称,这样当您想要引用其中一个程序集时,可以通过使用别名来指定要引用的程序集。

以下是对我有效的解决方案:

为程序集Dapper.StrongName赋予别名,我将以下内容添加到我的.csproj文件中:

<Target Name="StrongNameAlias" BeforeTargets="FindReferenceAssembliesForReferences;ResolveReferences">
  <ItemGroup>
    <ReferencePath Condition="'%(FileName)' == 'Dapper.StrongName'">
      <Aliases>MP_DapperStrongNameAlias</Aliases>
    </ReferencePath>
 </ItemGroup>
</Target>

然后,如果您想引用该程序集namespace,可以在.cs文件中使用其新添加的alies通过:: operator进行引用:

using MP_DapperStrongNameAlias::Dapper;

现在你可以自由地添加 using Dapper;,它不会再产生冲突了。
这篇文章可能会有帮助:C# 2.0: 在一个应用程序中使用不同版本的同一dll

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接