mirror of
https://github.com/dotnetcore/FreeSql.git
synced 2026-02-14 12:20:57 +08:00
update
24
聚合根.md
24
聚合根.md
@@ -282,3 +282,27 @@ InsertOrUpdate 执行逻辑依托聚合根对象的 `主键` 和 `状态管理`
|
||||
|
||||
- 无值,则 `抛出异常`;
|
||||
- 有值,逻辑同上;
|
||||
|
||||
## 使用建议
|
||||
|
||||
1、**分开定义**,按业务需求分开定义聚合根、及相关实体类。
|
||||
|
||||
传统单体项目表很多,在每个实体类设置导航属性会很累,即便定义了也只是一套庞大的实体关系模型,很难划分清除谁才是聚合根(例如 A-B-C-A 这种导航关系)。
|
||||
|
||||
应以业务为单位,为每个业务单独设计实体类,单一职责,隔离开发,这样才能更清淅的定义出聚合根实体。
|
||||
|
||||
2、**理解边界**,理解本文提出的边界规则。
|
||||
|
||||
- ManyToOne 导航属性,是 `边界之外`;
|
||||
- ManyToMany 导航属性,`中间表`(OrderTag) 是边界之内,`外部表`(Tag) 是 `边界之外`;
|
||||
- OneToOne 导航属性,是边界之内;
|
||||
- OneToMany 导航属性,是边界之内;
|
||||
|
||||
AggregateRootRepository 只对进行边界之内的数据进行递归 CRUD 操作,把聚合根看本一个整体。
|
||||
|
||||
如遇特殊情况,可以继承后重写 Select 属性扩大、或缩小查询内容:
|
||||
|
||||
- Insert/Delete/Update `扩大` 后的查询内容,不会对 `扩大` 后的数据进行增删改;
|
||||
- Update `缩小` 后的查询内容,由于导航属性值为 NULL,不会删除未查询的内容;
|
||||
|
||||
3、**善用事务**,使用事务解决一致操作问题。
|
||||
Reference in New Issue
Block a user