0

我有一个名为 的类Business,它的属性Id是 MS SQL Server 数据库中的标识字段。当我做一个INSERT,它工作正常。如果我执行以下操作:

_db.Update(business);

我收到一个错误:

无效的列名“id” 数据库中的列是 BusinessId

我已将其映射到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 的代码,我将使用它,直到找到真正的答案。

4

2 回答 2

2

您正在使用Dapper.FluentMap。该工具用作 Dapper 的映射器;不适用于 Dapper Contrib。
因此,在生成查询时,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> = ?. 如您所见,用于在生成查询ID时唯一标识要更新的记录。 不幸的是,我找不到这方面的参考。GitHub 帮助也没有明确提及。UPDATE

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

尽管您使用的是 Dapper Contrib,但此答案的大部分内容也适用于 Dapper Extensions 或与 Dapper 关联的其他一些查询生成器。

于 2021-08-02T12:52:18.173 回答
0

好的,我让它工作了。我的第一个问题是有几个包添加了 CRUD 方法(更新)。我的代码正在调用 Dapper.Contrib.Update 并且我想从 DommelMapper.Update 调用 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();
        }

问题是我调用了错误的更新扩展 (contrib) 而没有调用 Dommel 更新扩展,它无法识别我的映射

我已经安装了 Dommel 2.3.2、Dapper.Contrib 2.0.78、Dapper.FluentMap.Dommel 2.0.0

于 2021-08-06T22:24:59.360 回答