Dapper私有属性映射抛出异常



这似乎是一个重复的问题,但我觉得这更像是一个特定的场景。我正在一个新的微服务中实现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;

最后但并非最不重要的,因为公司是一个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将列映射到私有设置器的每一篇文章,每个人都说只要列名与属性名匹配,它"就可以工作"。我的列名匹配,但是我得到以下错误:

一个无参数的默认构造函数或一个匹配签名(System。Int32 ID, System。DateTime CreatedOn, System。Int32 CreatedBy, System。String DestinationWarehouseID, System。公司id,系统。需要字符串公司名称)模型。包实体化

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

相关内容

  • 没有找到相关文章

最新更新