首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DDD集合引用值对象映射到EF核

DDD集合引用值对象映射到EF核
EN

Stack Overflow用户
提问于 2022-07-03 17:05:48
回答 1查看 259关注 0票数 0

我在同一个有界上下文中有一个Company聚合根和一个Agreement聚合根。

我在我的项目中使用DDD方法。

公司和协议有一对多的关系,因此我指的是一家公司内部的协议,使用的是公司Id的引用。

代码语言:javascript
复制
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值对象,它看起来如下所示:

代码语言:javascript
复制
public class AgreementParty : ValueObject
{
    public Guid CompanyId { get; private set; }

    public string Name { get; }
}

和引用公司使用此值对象。

代码语言:javascript
复制
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中正确地保持。

希望我能很好地解释我的问题。

EN

回答 1

Stack Overflow用户

发布于 2022-07-06 00:43:59

我不会处理value对象,只需在Agreement类中添加公司名称的副本:

代码语言:javascript
复制
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
}

如果您需要保存不同值的历史记录,那么您可以建模具有一对多关系和一对一关系的CompanyMementoCompanyOriginator表。你的招数可以指的是留念行:

代码语言:javascript
复制
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模型和域模型之间引入一层映射。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72848428

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档