我有以下架构:
- 业务逻辑:商业逻辑发生在这里。该层涉及数据转换对象仅(=包含与业务相关数据的对象,没有技术数据)
- 数据访问层:提供与数据库的连接。接受数据转换对象并将它们转换为 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; }
}
创建发票时,我将仅在数据访问层上插入所有位置。
更新发票时,我必须考虑有关发票位置的以下案例:
- 什么都没有改变
- 添加了一个新职位
- 删除了位置
- 现有位置已更改
我该如何处理这些情况?我想我总是必须将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()));