【问题标题】:Dapper private property mapping throws exceptionDapper 私有属性映射抛出异常
【发布时间】:2021-11-23 06:55:27
【问题描述】:

这似乎是一个重复的问题,但我觉得这更像是一个特定的场景。我正在一个新的微服务中实现 DDD,并且我使用 Dapper 作为 ORM。我有以下域对象:

 internal Bundle(string warehouse, 
                    DateTime createdOn, 
                    int createdBy,
                    Company company,
                    BundleStatus status)
    {
        this.WarehouseID= warehouse;
        this.CreatedOn = createdOn;
        this.CreatedBy = createdBy;
        this.BundleStatus = status;
        this.Company = company;
        this.Packages= new HashSet<BundlePackages>();
    }

    private readonly HashSet<BundlePackages> packages;

    public string WarehouseID{ get; private set; }

    public int CreatedBy { get; private set; }
    
    public DateTime CreatedOn { get; private set; }

    public Company Company{ get; private set; }

    public BundleStatus Status { get; private set; }

    public IReadOnlyCollection<BundlePackage> Packages=> 
    shipments.ToList().AsReadOnly();

我正在通过以下方式查询数据:

  var sql = $@"SELECT * 
                FROM Bundle(except the Status, its going to be added later)

               SELECT ID, Name 
                FROM Packages";

        var dataResponse = await this.DbConnection.QueryMultipleAsync(sql);

        var agenda = dataResponse.Read<Bundle>().First();
        if(agenda != null)
        {
            var bundlePackages= bundle.GetType()
                .GetField("packages", BindingFlags.NonPublic | BindingFlags.Instance);

            bundlePackages.SetValue(bundle, dataResponse.Read<BundlePackages>());
        }

        return bundle;

最后但同样重要的是,由于 Company 是一个 EntityObject(ID 和 CompanyName 的私有集)并且 Dapper 不知道如何映射它们,我正在使用Dapper.FluentMapping:

        Map(bundle => bundle.Company.Id).ToColumn("CompanyID", caseSensitive: false);
        Map(bundle=> bundle.Company.Abbreviation).ToColumn("CompanyName", caseSensitive: false);

现在我已经阅读了几乎所有关于 Dapper 将列映射到私有设置器的文章,每个人都说它“正常工作”,只要列名与属性名匹配。我的列名匹配,但是我收到以下错误:

Models.Bundle 具体化需要无参数默认构造函数或一个匹配签名(System.Int32 ID、System.DateTime CreatedOn、System.Int32 CreatedBy、System.String DestinationWarehouseID、System.Int32 CompanyID、System.String CompanyName)

【问题讨论】:

    标签: c# .net orm domain-driven-design dapper


    【解决方案1】:

    如果您坚持使用私有设置器保留属性,则您的查询 SELECT * FROM Agendas 需要匹配构造函数中的参数类型/数量。 如果您将它们更改为公共设置器并添加默认构造函数,它应该可以工作(如果您的属性名称与您的查询列名称匹配)

    【讨论】:

    • 我从错误中明白了很多,但是提供的答案 - herehere 说了别的。 目前 Dapper 仅将数据自动映射到匹配的私有原始类型,如字符串、int 等,而不是复杂类型。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多