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

标签 c# entity-framework domain-driven-design code-first

场景是这样的:

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/

相关文章:

c# - 如何找出 iis7 中的 404 错误处理程序中缺少哪个请求路径?

c# - 子窗口顶部的 WPF 所有者窗口

c# - 使用接口(interface)将数据传递到数据层是否可以接受

c# - 如何将 XML 读入与其 xsd 匹配的类中

c# - 让 EF Linq Select 语句选择常量或函数

c# - ASP.NET Core 2.1 EF - 一对一关系仅在关系的一侧生成外键约束

c# - 在源中使用 NotMapped/Compulated 属性映射到目标时,Automapper ProjectTo<>() 出现问题

mysql - 六边形架构的 MySQL(加上 Redis)上的单查询或 JOIN 实现

domain-driven-design - DDD 存储库和工厂

c# - 数据数组的自定义序列化