我如何使用Dapper.使用FluentMap来更新带有标识列的实体?



我有一个叫做Business的类,它有一个属性Id,这是MS SQL Server数据库中的一个身份字段。当我做INSERT时,它工作正常。如果我做以下操作:

_db.Update(business);

我得到一个错误:

无效的列名'id"DB中的列为businessessid

我将其映射到Id,如下所示:

public class BusinessMap : EntityMap<Business>
{
public BusinessMap()
{
Map(x => x.Id).ToColumn("BusinessId");                
}
}

现在请记住我的INSERT作品。我尝试将Key属性添加到类

[Table("Business")]
public class Business {
[Key]
public int Id { get; set; }
public string Name { get; set; }
.....
}

我的工作(我讨厌,但总比没有好):
我决定打电话给一个SP来做这个,这有点糟糕,因为我希望dapper能处理这个。

_db.Query("BusinessUpdate",
param: new { businessId = business.Id, business.Name, business.LocatorUrl, business.Website }, commandType: CommandType.StoredProcedure);

我不知道为什么我们被迫得出结论,我们数据库中的每个标识列都命名为"id",在我看来这是荒谬的,我认为我不需要证明我的模式设计,它应该让我改变它。现在任何时候添加一个字段,我都必须改变SP和调用SP的代码,我将使用这个,直到我找到真正的答案。

您正在使用Dapper.FluentMap。这个工具可以作为Dapper的映射器;不是为了及时贡献。
因此,在生成查询时,Contrib不知道BusinessId列是否映射为Id属性。它假设对于Id属性,存在一个Id列。INSERT工作是因为您的主键是由您正在使用的RDBMS自动生成的。
要了解更多关于将列/表名称映射到属性/类的信息,请参考这个问题。

如果你试图使用Dapper Contrib更新/更改ID,那么它是不支持的。这是因为像Dapper Contrib这样的orm在生成查询时使用ID唯一地标识记录。
所以当你调用_db.Update(business);方法时,Dapper Contrib会生成类似UPDATE <table name> SET <column list except ID, with new values> WHERE <ID column> = ?的查询。如您所见,在生成UPDATE查询时,ID被用来唯一地标识要更新的记录。
遗憾的是,我找不到相关的参考资料。GitHub帮助也没有明确提到它。

另一种方法是绕过Dapper Contrib,直接使用Dapper的Execute方法,手工编写查询。我不确定,但是戴珀。FluentMap也有CRUD查询生成器命名为Dommel;您可以尝试它支持的一对一映射。

虽然你使用的是Dapper Contrib,但这个答案的大部分也适用于Dapper Extensions或其他与Dapper相关的查询生成器。

好了,我让它工作了。我的第一个问题是有几个添加CRUD方法的包(Update)。我的代码正在调用Dapper.Contrib.Update,我想从DommelMapper调用Update。更新后,我得到我的导入使用正确的Nuget包。我取得了进步……以下是对我有用的

public class BusinessMap :   DommelEntityMap<Business>
{
public BusinessMap()
{
ToTable("Business");
Map(x => x.Id).ToColumn("BusinessId").IsKey().IsIdentity();
}
}

FluentMapper.Initialize(config =>
{
config.AddMap(new BusinessMap());
config.ForDommel();
});
public void UpdateBusiness(Business business)
{
using TransactionScope t = new TransactionScope();
_db.Update(business);
t.Complete();
}

问题是我调用了错误的更新扩展(贡献),而不是调用Dommel更新扩展,它不识别我的映射

我已经安装了Dommel 2.3.2, Dapper。贡献2.0.78,Dapper.FluentMap.Dommel 2.0.0

最新更新