我试图简化我的代码,并将一些核心逻辑移动到实体框架实体本身(看起来像这就是为什么我们有实体模型业务逻辑)。目前实体几乎只是一堆属性和集合。从EF4实体方法中删除收集实体
我正在寻找具有从集合中删除项目并将其添加到实体上的另一个集合的实体上的函数。
现在添加到其他收藏功能完美的作品。然而,删除 - 从集合中删除项目,但它不会删除。
我得到:
操作失败:关系不能被改变,因为一个或多个外键的属性是不可为空。
据我所知,这是因为从集合中删除并不实际标记为删除,并且当上下文保存更改发生时,它被关键打乱,但未标记为删除。因为我不在存储库中,并且无法访问其中的上下文。我该如何让上下文知道这个项目需要删除?
我以为我应该确保域实体封装适当的业务逻辑。这只是做错了什么?我怎样才能解决这个问题?我应该绕过这个吗?
如果我使用的扩展方法:
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模型 - 首先它们不是,但我们可以把它留在隐藏的范围之内)。因此,如果只是在域级别添加和删除对象不起作用,我会为这种逻辑创建一个持久感知服务。 – 2012-03-07 19:59:43
是的,我通常不会在这种情况下结束。插入和更新由存储库处理。然而,我的一个领域概念似乎需要从集合中移除当前事件并将其移至另一个集合。我想模拟清晰时事的概念。 – GraemeMiller 2012-03-07 20:13:17
如果您更改活动的父项,该怎么办?无论如何,只要涉及到删除标记,并且肯定需要对象上下文时,我会将其留给服务。 – 2012-03-07 20:39:01