我有一个叫做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