繁体   English   中英

如何在不访问对象上下文的情况下删除Entity Framework中的关联对象

[英]How to delete an associated object in Entity Framework without having access to the object context

有两个模型,即“站点”和“链接”,其中一个站点具有许多链接,如何从不能访问对象上下文的“站点”方法中删除链接?

我已经尝试过类似的东西:

public void DeleteFirstLink() {
    var link = LinkSet.First();
    LinkSet.Remove(link);
}

但似乎并不是真正删除链接,而是破坏了关联。 由于存在数据库约束,因此会引发以下错误:

正在从AssociationSet'Sites_have_Links'添加或删除关系。 由于基数限制,还必须添加或删除相应的“链接”。

我实际上如何从数据库中删除链接?

假设在调用DeleteFirstLink()方法时ObjectContext没有处于活动状态,则可以通过在方法内部旋转上下文,附加Site实体,然后删除链接来使其工作:

public void DeleteFirstLink()
{
  using (ProjectEntities db = new ProjectEntities())
  {
    db.AttachTo("[your site EntitySet name - SiteSet?]", this);
    var link = LinkSet.First();
    db.DeleteObject(link);
    LinkSet.Remove(link);
    db.SaveChanges();
  }
}
  1. 要使用实体,以便使修改反映在数据库中,您必须在对象上下文中(根据数据库上下文中的EF5) 添加/附加这些实体,然后使用方法SaveChanges提交更改。

  2. 是的,在EF4中,要从物理SQL表(不是链接)中删除一条记录,您需要使用对象ObjectContext的 DeleteObject方法,然后使用SaveChanges ,即

     using(ObjectContext context = new ObjectContext) { /* Find the removed record in object/database context (this will attaches * the record to object/database context) * It is recommened to use FirstOrDefault() instead of First() * becase this method can return null if there is no record to delete * instead generation of exception in case of using First() */ Link linkToDelete = context.Links.FirstOrDefault(); if(linkToDelete != null) { context.DeleteObject(linkToDelete); context.SaveChanges(); } } 
  3. . 幸运的是,现在有EF5允许从父集合中删除,但前提是关系是

     using(DatabaseContext context = new DatabaseContext) { Link linkToDelete = context.Links.FirstOrDefault(); if(linkToDelete != null) { context.Links.Remove(linkToDelete); context.SaveChanges(); } } 
  4. 无论如何,请不要忘记调用SaveChanges!

没有对象上下文,您无法从数据库中删除任何内容。 所有操作都在对象上下文的状态管理器中排队,并且在您调用ObjectContext.SaveChanges()时将这些操作持久化到数据库中。 没有SaveChanges,就不会更改数据库。

首先,如果您可以发布有关类结构的更多信息,那就太好了。 Site类是否具有ObjectContext对象? 然后,作为快速解决方案,您可以将其传递到delete方法中,并使用context.DeleteObject()方法,然后再调用SaveChanges。

但是,作为长期解决方案,我仍然建议使用UnitOfWork模式,并且将链接发布到再次解释它的文章上 实现可能有所不同,但通常它可以解决大多数问题(类似于此问题)。

这种方法的优点在于,如果正确使用它,则可以构建一个小的框架,以后可以在所有EF项目中重用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM