10

我在 MVC5 c# 环境中使用Dapper和,有时(!)当我部署生产站点时,我收到错误说明:Dapper.Contrib

GetAll<T>仅支持在Dapper.Contrib.Extensions.SqlMapperExtensions.GetAllAsync [T](IDbConnection connection, IDbTransaction事务,Nullable`1 commandTimeout)

不过,这种情况只发生在大约三分之一的部署中。

我怀疑它会以某种方式Dapper.Contrib自动注意到我的主键,因为它被命名为"Id",但我已经用[ExplicitKey](它是一个 GUID)装饰了它,也许这些属性会发生冲突。也许这是完全不同的东西......

除了可能重命名我的主键之外,关于如何解决这个问题的任何想法?

来自相关模型的一块:

[Table("Tasks")]
public class TasksModel
{
    [ExplicitKey]
    public Guid Id { get; set; }

...
4

1 回答 1

1

我认为这与属性名称“id”有关。以下来自Dapper/SqlMapperExtensions.cs中的 KeyCache 构建代码,当没有具有 [Key] 属性的属性时。

var idProp = allProperties.Find(p => string.Equals(p.Name, "id", StringComparison.CurrentCultureIgnoreCase));

在您的情况下,您会同时获得一个 ExplicitKey(通过在模型中使用 [ExplicitKey] 装饰您的密钥)和一个密钥(默认情况下,此属性称为 Id)。除非您可以更改数据库列名,否则我会使用常规的 Dapper。

于 2019-03-26T16:41:30.710 回答