Dapper.SimpleCRUD 插入/更新/获取失败并显示消息“实体必须具有至少一个 [Key] 属性”

Posted

技术标签:

【中文标题】Dapper.SimpleCRUD 插入/更新/获取失败并显示消息“实体必须具有至少一个 [Key] 属性”【英文标题】:Dapper.SimpleCRUD Insert / Update / Get fails with message "Entity must have at least one [Key] property" 【发布时间】:2015-10-21 16:45:31 【问题描述】:

我是 Dapper 的新手。尝试将 CRUD 操作与 Dapper 和 Dapper.SimpleCRUD 库合并。这是示例代码... 我的数据模型看起来像

Class Product

  public string prodId get;set;
  public string prodName get;set;
  public string Location get;set;

Dapper 实现 - 插入

public void Insert(Product item)

    using(var con = GetConnection())
    
      con.Insert(item);
    

由于 Db 中的 ProdId 是一个标识列,因此它失败了。它如何表明 ProdId 是 DB 中的标识列?

Dapper 实现 - 获取

public IEnumerable<Product> GetAll()

        IEnumerable<Product> item = null;
        using (var con = GetConnection())
        
            item = con.GetList<Product>();
        
        return item;

它给出了一个例外:

“实体必须至少有一个 [Key] 属性”!

【问题讨论】:

【参考方案1】:

发生这种情况是因为您使用的是 Dapper 扩展,它实现了 Insert CRUD 扩展方法。理想情况下,这可以通过简单的方式实现

con.Execute 在 Dapper 中,但是由于你想传​​递一个对象并通过扩展自动创建一个插入查询,你需要帮助它理解,它是给定产品实体的主键,下面的修改会有所帮助:

[Key]
public string prodId get;set;

其中 Key 属性应在Dapper ExtensionComponent Model 中实现。

或者,您可以将 prodId 重命名为 Id,这将自动使其成为密钥。还要检查以下link,您可以在其中为实体创建单独的映射器,从而定义密钥,无论您的情况如何

【讨论】:

我尝试添加 [Key] 属性,但无法找到它必须来自哪个库。尝试使用 Dapper;并使用 System.ComponentModel.DataAnnotations.Schema;我应该导入任何库吗? 需要检查来自 Github 的 DapperExtension 实现,确定解决方法是将 Key 列设为 Id,可以使用 Dapper - Fluent Map - github.com/henkmollema/Dapper-FluentMap 将其映射到不同名称的 db 列,或者我更喜欢使用 connection.Execute,它可以完美运行 您是否检查了答案中的链接,您可以在其中为 Key 创建显式映射,这样会更简单,请选择一个选项以使其工作 奇怪的是 github.com/ericdc1/Dapper.SimpleCRUD dodumaetation 建议相同的 Key 属性。还要检查 SimpleCRUD、Rainbow 和 Contrib 的选项 - ***.com/a/13052147/1559611 使用 Dapper.SimpleCRUD,您必须使用 [key] 属性标记该字段。但这只有在数据库为您创建密钥的情况下。如果要管理密钥,则需要添加 [Required] 属性。 Dapper.SimpleCRUD 忽略标有 [key] 属性的属性,除非它具有 [Required] 属性示例:: [Table("Contacts")] public class Contacts : IContacts [Required] [Key] public Guid objid get ;放; ...【参考方案2】:

连接到 SQL Server 2016 时,当我忘记将主键附加到表的 Id 列时,Dapper.Contrib 和 Dapper.SimpleCRUD 都出现此错误。

将主键添加到表中,重新构建并发布项目以清除缓存,并且 [Key] 和 [ExplicitKey] (后者在 DapperContrib 中)都很好。

【讨论】:

以上是关于Dapper.SimpleCRUD 插入/更新/获取失败并显示消息“实体必须具有至少一个 [Key] 属性”的主要内容,如果未能解决你的问题,请参考以下文章

Dapper SimpleCRUD Demo

带有 GUID Id 的简洁 CRUD

具有相同依赖项的不同版本的 nuget 包的 azure 函数

DataGrid 的 DataSet 提供程序的插入/更新方法的问题

为啥将整数插入 SQLite 会爆炸?

Vue组件收到数据后如何更新