博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
DDD:使用EntityFramework的话,如果只为聚合根设计仓储,其它实体如何处理?
阅读量:6983 次
发布时间:2019-06-27

本文共 1689 字,大约阅读时间需要 5 分钟。

背景

DDD中只有聚合根可以有仓储,仓储负责整个聚合持久化的相关生命周期,在不使用工作单元或POCO的情况下,我们可以让Order内部直接调用DAL操作OrderItem。我们也可以让Order跟踪所有OrderItem的状态,然后在OrderRepository内部操作OrderItem。如果我们采用了重量级的ORM工具,如:EntityFramework,事情会不会变得简单呢?

使用EntityFramework持久化聚合

关键思路:双主键。

示例聚合

这里以订单和订单项为例。

Order管理OrderItem

1         public void AddOrderItem(OrderItem item) 2         { 3             item.MustNotNull("item"); 4  5             this.State.BeforeChangeOrder(); 6  7             item.OrderId = this.Id; 8             this.OrderItemCollection.Add(item); 9             this.Total += item.Subtotal;10         }11 12         public void RemoveOrderItem(Guid productId)13         {14             this.State.BeforeChangeOrder();15 16             var item = this.OrderItemCollection.First(x => x.ProductId == productId);17             this.OrderItemCollection.Remove(item);18             this.Total -= item.Subtotal;19         }

映射配置

1             modelBuilder 2                 .Entity
() 3 .HasKey(x => new { x.Id, x.OrderId }); 4 5 modelBuilder 6 .Entity
() 7 .HasKey(x => x.Id); 8 modelBuilder 9 .Entity
()10 .Property(x => x.OptimisticKey).IsRowVersion().IsConcurrencyToken();11 modelBuilder12 .Entity
()13 .HasMany(x => x.OrderItemCollection).WithRequired().HasForeignKey(x => x.OrderId).WillCascadeOnDelete();

注意:上面为OrderItem配置了双主键,如果不这么配置,删除逻辑会错误,要么删除后提交失败,要么OrderItem的数据库记录还在,只是OrderId变为NULL了。

备注

考虑到聚合内非聚合根的实体都具有“本地标识”,采用“双主键”就非常合理了,这个错误新手经常犯的。

再说一个题外话,聚合内的实体的标识能被其它聚合引用吗?我觉得应该是可以的,前提是必须同时引用其完整的标识,即:双主键。

 

转载地址:http://evvpl.baihongyu.com/

你可能感兴趣的文章
Butterknife 的简单使用 和 配合 Butterknife的插件 Zelezny
查看>>
Magento利用input type=”file”上传图片
查看>>
Android音频开发(4):如何存储和解析wav文件
查看>>
Handler延迟事件使用
查看>>
【DG】Oracle 19c使用dbca来搭建物理DG
查看>>
Cython安装
查看>>
StringBuilder 、StringBuffer 、 String
查看>>
brew install php55 报错 clang: error
查看>>
ubuntu18.4 安装swoole 和 php 扩展 swoole
查看>>
pcDuino入门心得+HDMI声音+蓝牙功放
查看>>
面向对象2
查看>>
c++测试题2016-6-2
查看>>
Nginx与Serssion一致性问题
查看>>
社会化工程攻击针对目标不再仅限最终用户
查看>>
Hadoop源码分析HDFS ClientProtocol——getBlockLocations
查看>>
AndroidWidget实践 --- EverydayTips开发(6)
查看>>
mysql 随机查询数据
查看>>
CodeIgniter学习笔记一
查看>>
workspace-project-target关系与解耦工程结构总结
查看>>
EhCache的配置
查看>>