Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework 从EF4实体方法中删除集合实体_Entity Framework_Entity Framework 4_Domain Driven Design_Entity - Fatal编程技术网

Entity framework 从EF4实体方法中删除集合实体

Entity framework 从EF4实体方法中删除集合实体,entity-framework,entity-framework-4,domain-driven-design,entity,Entity Framework,Entity Framework 4,Domain Driven Design,Entity,我试图简化代码,并将一些核心逻辑转移到实体框架实体本身(似乎这就是为什么我们有实体为业务逻辑建模的原因)。目前,实体几乎只是一堆属性和集合 我希望在实体上有一个函数,从集合中删除一个项,并将其添加到实体上的另一个集合中 现在,add-to-other集合函数可以完美地工作。但是,移除-从集合中移除该项,但它不会删除 我得到: 操作失败:无法更改关系,因为一个或多个外键属性不可为null 我理解这是因为从集合中删除实际上并没有标记为删除,当发生上下文保存更改时,键被置空但没有标记为删除会使它不安。

我试图简化代码,并将一些核心逻辑转移到实体框架实体本身(似乎这就是为什么我们有实体为业务逻辑建模的原因)。目前,实体几乎只是一堆属性和集合

我希望在实体上有一个函数,从集合中删除一个项,并将其添加到实体上的另一个集合中

现在,add-to-other集合函数可以完美地工作。但是,移除-从集合中移除该项,但它不会删除

我得到:

操作失败:无法更改关系,因为一个或多个外键属性不可为null

我理解这是因为从集合中删除实际上并没有标记为删除,当发生上下文保存更改时,键被置空但没有标记为删除会使它不安。因为我不在存储库中,无法访问其中的上下文。我应该如何让上下文知道此项目需要删除

我想我应该确保域实体封装了适当的业务逻辑。这是不是做错事了?我怎样才能避开这件事?我应该绕开这件事吗

如果我使用扩展方法:

public static ObjectContext GetContext(this IEntityWithRelationships entity)
{
    if (entity == null)
        throw new ArgumentNullException("entity");

    var relationshipManager = entity.RelationshipManager;

    var relatedEnd = relationshipManager.GetAllRelatedEnds()
                                        .FirstOrDefault();

    if (relatedEnd == null)
        throw new Exception("No relationships found");

    var query = relatedEnd.CreateSourceQuery() as ObjectQuery;

    if (query == null)
        throw new Exception("The Entity is Detached");

    return query.Context;
}
我可以访问实体中的上下文,如下所示:

var context = this.GetContext() as Entities;
context.events.DeleteObject(event);

这看起来很可怕,但确实有效。这样做肯定不是正确的方法吗?

我更改了模型,通过使用包含父密钥的复合密钥来建立父标识和子标识之间的关系,从而识别关系。这意味着从子集合中删除实体将在不需要访问上下文的情况下删除它。请看这个问题

追求领域驱动设计是件好事(+1),但您混淆了DDD和数据层的责任。您的域类应该忘记持久性逻辑(好吧,首先使用EF模型,它们不会忘记,但我们可以将其隐藏起来)。因此,如果仅仅在域级别添加和删除对象不起作用,我会为这种逻辑提供一个持久性感知服务。是的,我通常不会出现这种情况。插入和更新由存储库处理。然而,我的一个域概念似乎需要从集合中删除当前事件并将其移动到另一个集合。我想对清除当前事件的概念进行建模。如果您更改事件的父级,该怎么办?无论如何,一旦涉及到标记删除,而且最确定的是,当需要对象上下文时,我会将其留给一个服务。是的,因为EF要求我使用上下文标记删除,所以我只需要将此功能保留在一个为我处理它的服务中。谢谢你的建议