目录

背景使用EntityFramework持久化聚合备注

背景返回目录

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<OrderItem>()
3 .HasKey(x => new { x.Id, x.OrderId });
4
5 modelBuilder
6 .Entity<Order>()
7 .HasKey(x => x.Id);
8 modelBuilder
9 .Entity<Order>()
10 .Property(x => x.OptimisticKey).IsRowVersion().IsConcurrencyToken();
11 modelBuilder
12 .Entity<Order>()
13 .HasMany(x => x.OrderItemCollection).WithRequired().HasForeignKey(x => x.OrderId).WillCascadeOnDelete();

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

备注返回目录

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

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

 
分类: DDD

最新文章

  1. 学习Sass 的基本语法规则[Sass和compass学习笔记]
  2. MATLAB基础知识之内存映射
  3. BLE编程中关键步骤
  4. linux文件系统---10
  5. 备份数据库SQL Server 2008下实测
  6. 【HDOJ】1422 重温世界杯
  7. jni使用
  8. 使用mod_cluster进行apache httpd server和jboss eap 6.1集群配置
  9. 关于DataGridViewComboBoxCell修改后提交数据源
  10. Ext3和Ext4文件系统区别
  11. java基础回顾(2)
  12. iOS开发之八:UISlider、UISegmentedControl、UIPageControl的使用
  13. SpringBoot+Mybatis+Maven+MySQL逆向工程实现增删改查
  14. 2018牛客网暑假ACM多校训练赛(第二场)E tree 动态规划
  15. Linux(64) 下 Tomcat + java 环境搭建
  16. 索引视图DEMO1
  17. Java之路(二) 操作符
  18. eclipse中改变默认的workspace的方法
  19. jenkins 集成redmine
  20. SpringBoot Lombok

热门文章

  1. cocos2d 缓存池 对象的再利用
  2. Visual Studio-Sequence Diagram
  3. Appium:通过wifi连接Android设备
  4. jQuery版推箱子游戏详解和源码
  5. hdu2203 KMP水的问题
  6. struts2 模型分配问题和延迟加载问题
  7. visual studio 辅助工具
  8. 登录记住账号和密码小Demo
  9. WCF常见问题(1) -- WebService/WCF Session Cookie
  10. 给phpcms v9加入一个主题radio无线电button,它可反复使用,以创建不同的专题部分内容编辑器,添加一个主题来定义自己的领域