我在同一个有界上下文中有一个Company聚合根和一个Agreement聚合根。
我在我的项目中使用DDD方法。
公司和协议有一对多的关系,因此我指的是一家公司内部的协议,使用的是公司Id的引用。
public class Agreement : Entity, IAggregateRoot
{
public Guid AgreementId { get; private set; }
public Guid CompanyId { get; private set; }
private string _number;
// other fields and functions omitted
}我使用EF核心将这些模型映射到数据库,一切都很好。阅读部分是分开的,所以不用担心。
现在,如果公司名称在公司协议最后确定后被更改,我想在我的协议中保留旧的名称。
因此,正如我所理解的,我应该将引用CompanyId封装在协议中,以类似于AgreementParty值对象,它看起来如下所示:
public class AgreementParty : ValueObject
{
public Guid CompanyId { get; private set; }
public string Name { get; }
}和引用公司使用此值对象。
public class Agreement : Entity, IAggregateRoot
{
public Guid AgreementId { get; private set; }
private AgreementParty _party;
private string _number;
// other fields and functions omitted
}但是现在,我不知道如何在EF核心实体配置中映射这个新的协议模型,以便我的域关系(Company有许多协议)在db中正确地保持。
希望我能很好地解释我的问题。
发布于 2022-07-06 00:43:59
我不会处理value对象,只需在Agreement类中添加公司名称的副本:
public class Agreement : Entity, IAggregateRoot
{
public Guid AgreementId { get; private set; }
public Guid CompanyId { get; private set; }
public string CompanyName { get; private set; }
private string _number;
// other fields and functions omitted
}如果您需要保存不同值的历史记录,那么您可以建模具有一对多关系和一对一关系的CompanyMemento和CompanyOriginator表。你的招数可以指的是留念行:
public class CompanyOriginator
{
public Guid CompanyId { get; set; }
public virtual ICollection<CompanyMemento> History { get; set; }
public CompanyMemento Current { get; set; }
}
public class CompanyMemento
{
public Guid CompanyId { get; set; }
public DateTime ValidFrom { get; set; }
public DateTime? ValidUntil { get; set; }
public string CompanyName { get; set; }
}
public class Agreement
{
public Guid AgreementId { get; set; }
public CompanyMemento Company { get; set; }
}但是,在这种情况下,您需要一个单独的业务模型,并且需要在EF模型和域模型之间引入一层映射。
https://stackoverflow.com/questions/72848428
复制相似问题