【发布时间】: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