背景
现在很流行值对象,值对象有如下特点:开发简单、使用简单和多线程安全。我试着让 EntityFramework 中的实体保持值语义,这样的话,对值语义实体的修改就应当等于“整体替换”,好像有点问题,大家给点意见。
值语义的 OrderItem
代码
1 public void UpdateOrderItem(Guid productId, int quantity) 2 { 3 var item = this.OrderItemCollection.First(x => x.ProductId == productId); 4 5 this.RemoveOrderItem(productId); 6 7 this.AddOrderItem(item.ChangeQuantity(quantity)); 8 }
上边的代码运行会失败,提示:主键重复,查看生成的 SQL 会发现:“先执行 insert,后执行 delete”。
局部范围的修改权限
既然没办法保持绝对的值语义,我们可以将修改的访问控制级别设置为最低:internal,看代码:
1 public void UpdateOrderItem(Guid productId, int quantity) 2 { 3 var item = this.OrderItemCollection.First(x => x.ProductId == productId); 4 5 this.Total -= item.Subtotal; 6 item.ChangeQuantity(quantity); 7 this.Total += item.Subtotal; 8 }
上边代码中 ChangeQUantity 的访问级别为 internal。
备注
有好思路的朋友给点建议。