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 Extension
或Component 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] 属性”的主要内容,如果未能解决你的问题,请参考以下文章
具有相同依赖项的不同版本的 nuget 包的 azure 函数