【发布时间】:2012-12-13 14:00:45
【问题描述】:
我有一个带有 Add、Update、Delete 的通用存储库。 我们将其命名为 CustomerRepository。
我有一个名为 Customer 的实体 (POCO),它是一个聚合根,带有 Addresses。
public class Customer
{
public Address Addresses { get; set; }
}
我处于分离实体框架 5 场景中。
现在,假设在获得客户后,我选择删除客户地址。 我通过 Update 方法将 Customer 聚合根提交到存储库。
如何保存对地址所做的修改?
- 如果地址id为0,我可以假设地址是新的。
- 对于地址的其余部分,我可以选择附加所有地址,并标记为已更新。
- 对于已删除的地址,我看不到任何解决方法...
我们可以说这个解决方案是不完整且低效的。
那么聚合根子节点应该如何更新呢?
我是否必须使用 AddAddress、UpdateAddress、DeleteAddress 等方法来完成 CustomerRepository?
这似乎会打破这种模式......
我是否在每个 POCO 上设置了 Persistence 状态:
public enum PersistanceState
{
Unchanged,
New,
Updated,
Deleted
}
然后在我的 CustomerRepository 中只有一种方法,Save?
在这种情况下,我似乎正在重新发明实体“非 POCO”对象,并将数据访问相关属性添加到业务对象......
【问题讨论】:
-
这些是 EF 实体吗?如果我错了,请纠正我,但是如果您加载聚合根(
Customer)并访问其导航属性(即Addresses),这些不应该被延迟加载,附加到上下文并因此被保存/调用SaveChanges时自动删除? -
在我的例子中,客户是分离的,然后是附加的,而不是从 DbContext 加载的。 Poco 实体完全独立于 EF,不可能有延迟加载。
-
好的,所以您的意思是在您的存储库中,您加载客户(ENTITY POCO)并将其映射到 DOMAIN POCO,
Customer?然后在你想把它映射回一个 ENTITY POCO 并保存之前对它做一些操作? -
不,POCO 是实体,这要归功于 POCO T4 模板。
-
天啊...您是否使用代理(从
DbContext加载)?
标签: entity-framework repository domain-driven-design aggregateroot