我正在尝试简化我的代码并将一些核心逻辑移到实体框架实体本身(似乎这就是为什么我们有实体模拟业务逻辑)。目前,实体几乎只是一堆属性和集合。
我正在寻找在实体上有一个从集合中删除项目的函数,并将其添加到实体上的另一个集合。
现在添加到其他集合功能完美无缺。但是删除 - 从集合中删除项目,但它不会删除。
我明白了:
操作失败:无法更改关系,因为一个或多个外键属性不可为空。
我理解这是因为从集合中删除实际上并不标记删除,并且当上下文保存更改发生时,它被置零但未标记为删除的键令人不安。因为我不在存储库中,并且无法访问其中的上下文。我怎么能让上下文知道这个项目需要删除?
我以为我应该确保域实体封装了适当的业务逻辑。这是错误的做法吗?我怎么能绕过这个?我应该绕过这个吗?
如果我使用扩展方法:
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);
这看起来很可怕,但确实有效。当然这样做不是正确的方法吗?
答案 0 :(得分:0)
我更改了模型,通过使用包含父键的复合键来确定父和子身份之间的关系来识别关系。这意味着从子集合中删除实体会删除它,而不需要访问上下文。请参阅此问题Is it possible to remove child from collection and resolve issues on SaveChanges?