处理业务逻辑和数据访问层之间的一对多关系



我有以下架构

  • 业务逻辑:商业逻辑发生在这里。该层涉及数据转换对象仅(=包含与业务相关数据的对象,没有技术数据)
  • 数据访问层:提供与数据库的连接。接受数据转换对象并将它们转换为 Entity对象(=包含数据库相关信息(例如技术ID)的对象)。返回数据变换对象
  • 其他一些层(不重要)

现在我正在处理一对多的关系(例如:发票可以具有多个职位)。

数据转换对象

public class InvoiceDto
{
    public string Number { get; set; }
    public DateTime CreationDate { get; set; }
    public List<InvoicePositionDto> InvoicePositions { get; set; }
}
public class InvoicePositionDto
{
    public string Description { get; set; }
    public decimal Costs { get; set; }
}

实体对象

[Table("Invoices")]
public class InvoiceEntity : BaseEntity
{
    [Required]
    public string Number { get; set; }
    [Required]
    public DateTime CreationDate { get; set; }
    public virtual ICollection<InvoicePositionEntity> InvoicePositions { get; set; }
}
[Table("InvoicePosition")]
public class InvoicePositionEntity : BaseEntity
{
    [Required]
    public string Description { get; set; }
    [Required]
    public decimal Costs { get; set; }
    [Required]
    public int InvoiceId { get; set; }
    public virtual InvoiceEntity Invoice { get; set; }
}

创建发票时,我将仅在数据访问层上插入所有位置

更新发票时,我必须考虑有关发票位置的以下案例:

  1. 什么都没有改变
  2. 添加了一个新职位
  3. 删除了位置
  4. 现有位置已更改

我该如何处理这些情况?我想我总是必须将InvoicePositionDtos与现有数据集的InvoicePositionEntities"比较"。有一个简单的方法吗?

技术细节 - 使用以下框架:

  • 实体框架
  • Automapper

您是否尝试了以下内容?

AutoMapper.Mapper.CreateMap<InvoiceDto, InvoiceEntity>()
    .ForMember(dest => dest.InvoicePositions, opts => opts.MapFrom(src => src.InvoicePositions.Select(x => AutoMapper.Mapper.Map<InvoiceEntity>(x)).ToList()));

最新更新