gpt4 book ai didi

c# - EF 代码首先是 : How to delete a row from an entity's Collection while following DDD?

转载 作者:可可西里 更新时间:2023-11-01 03:00:25 26 4
gpt4 key购买 nike

场景是这样的:

DDD 声明您使用存储库获取聚合根,然后使用它来添加/删除它拥有的任何集合。

添加很简单,您只需在要添加到的 Collection 上调用 .Add(Item item)。保存时会向数据库中添加一个新行。但是,删除是不同的 - 调用 .Remove(Item item) 不会从数据库中删除项目,它只是删除外键。因此,是的,从技术上讲,它不再是收藏的一部分,但它仍在数据库中。

仔细阅读,唯一的解决方案是使用数据上下文将其删除。但是根据 DDD,域对象不应该知道数据上下文,因此必须在域外进行删除。

解决这个问题的正确方法是什么?或者让数据库中充满孤儿是可以接受的吗(也许运行一个例程来清除它们)?

最佳答案

我已经通过使用 domain events 解决了我目前正在处理的应用程序中的这个问题。 ; DDD 概念 Eric Evans said应该在他的书中。

虽然不允许域对象了解对象上下文,但 IDomainEventHandler 是 - 因此我有一个 DomainObjectDeletionHandler,它从控制权返回我的应用程序层并保存更改之前的对象上下文。

有关更多信息,我写了a blog关于我对域事件的实现以及我如何将所有东西连接在一起。

希望对您有所帮助:)

编辑

例如,如果您有一个 Order 类,它有一个类型为 OrderItemOrderItems 集合:

public class Order
{
// Other stuff

public void RemoveOrderItem(int orderItemId)
{
var orderItemToRemove = OrderItems.First(oi => oi.Id == orderItemId)

OrderItems.Remove(orderItemToRemove);

DomainEvents.Raise(new OrderItemRemoved(orderItemToRemove));
}
}

关于c# - EF 代码首先是 : How to delete a row from an entity's Collection while following DDD?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8360239/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com