Dapper.Contrib - "仅支持具有单个[Key]或[ExplicitKey]的实体"

Mac*_*kan 7 c# dapper dapper-contrib

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

GetAll<T> 在Dapper.Contrib.Extensions.SqlMapperExtensions.GetAllAsync [T](IDbConnection连接,IDbTransaction)的Dapper.Contrib.Extensions.SqlMapperExtensions.GetSingleKey [T](String方法)中仅支持具有单个[Key]或[ExplicitKey]属性的实体transaction,Nullable`1 commandTimeout)

这只发生在每三个部署一次.

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

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

有问题的模型中的一块:

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

...
Run Code Online (Sandbox Code Playgroud)

小智 1

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

var idProp = allProperties.Find(p => string.Equals(p.Name, "id", StringComparison.CurrentCultureIgnoreCase));
Run Code Online (Sandbox Code Playgroud)

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