【发布时间】:2019-01-04 01:59:49
【问题描述】:
我正在使用 asnet 样板 aspnet 核心和 ef 核心。我在 PreInitialize 中初始化了 automapper.collection,如下所示:
Configuration.Modules.AbpAutoMapper().Configurators.Add(
cfg =>{
cfg.AddCollectionMappers();
cfg.CreateMap<OrderDTO, Order>().EqualityComparison((odto, o) => odto.ID == o.ID);
cfg.CreateMap<OrderItemDTO, OrderItem>().EqualityComparison((odto, o) => odto.ID == o.ID);
}
);
我正在使用 ObjectMapper.Map(odto, o);在 dto 和实体之间进行映射,但我发现订单中的 orderitems 集合中的新 orderitem 保存得很好,但是对现有条目的任何编辑似乎都不会更新到数据库。
订单实体和集合使用以下内容从存储库中加载:
var @item = await _orderRepository.GetAll().Include(x => x.Items).Include(x => x.Items).ThenInclude(x => x.Product).AsNoTracking().FirstOrDefaultAsync(x => x.Id == id);
这里是更新方法:
public override async Task<OrderDto> Update(OrderDto input)
{
var ord = await _orderManager.GetA(input.Id);
ObjectMapper.Map(input, ord);
CheckErrors(await _orderManager.UpdateA(ord));
return MapToEntityDto(await _orderManager.GetA(input.Id));
}
尝试更新orderitem记录时,input和ord变量的值如下:
input {OrderDto}
Code "1" string
Id 1 int
Items Count = 1 System.Collections.Generic.ICollection<OrderItemDto>
- [0] {OrderItemDto}
Id 1 int
OrderId 1 int
+ Product {ProductLoadDto}
ProductId 4 int
Quantity 22 double
MovementDate {28-Jul-18 2:36:41 AM} System.DateTime
ord {[Order 1]} Order
Code "1" string
Id 1 int
Items Count = 1 System.Collections.Generic.ICollection<OrderItem>
- [0] {OrderItem 1}
Id 1 int
OrderId 1 int
+ Product {[Product 4]} Venues.Products.Product
ProductId 4 int
Quantity 1 double
MovementDate {28-Jul-18 12:06:41 PM} System.DateTime
我是否缺少让 automapper.collection 自动处理集合编辑的东西?
【问题讨论】:
-
显示您的订单保存方法以及 OrderDto 和 OrderItemDto 的内容。
-
我已将这些详细信息添加到原始帖子中。干杯
-
大家好,我仍然面临这个问题。在从 dto 映射后,我可以验证新值是否在实体中,因此我假设此时 automapper.collection 包会将其标记为已修改。但是没有为订单项向 sql 发出更新语句,我如何/在哪里检查这些子实体的 changestate 状态?对于从 dto 的映射,我还需要做些什么来确认实体已更改并因此对其进行更新?
-
更正,似乎从集合中更新或删除的条目都不适用于数据库。
标签: asp.net-core collections entity-framework-core automapper aspnetboilerplate