如何删除在实体框架相关的对象,而不必访问对象上下文(How to delete an associa

2019-10-19 04:46发布

有两种型号,网站和链接,其中一个网站有许多环节,如何从网站的方法,不具有访问对象上下文中删除链接?

我已经试过类似:

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

但似乎没有真正删除链接,但打破了关联。 因为有一个数据库约束它抛出这个错误:

的关系被添加或从AssociationSet“Sites_have_Links”删除。 用基数约束,一个相应的“链接”也必须被添加或删除。

实际上,我怎么从数据库中删除的链接?

Answer 1:

假设你的ObjectContext的是不是还活着,当你调用DeleteFirstLink()方法,你可以把它通过转所述方法中的上下文,连接网站的实体,然后删除链接的工作:

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();
  }
}


Answer 2:

没有对象上下文不能从数据库中删除任何东西。 一切行动都是排队对象上下文中的状态管理器,以及那些当你调用被保存到数据库ObjectContext.SaveChanges() 如果没有的SaveChanges,没有DB变化。



Answer 3:

首先,这将是巨大的,如果你可以发布你的类结构提供更多的信息。 是否站点类有一个ObjectContext的对象? 然后,作为一个快速的解决方案,你可以将它传递到delete方法和使用context.DeleteObject()方法,并随后调用的SaveChanges。

然而,作为一个长期的解决方案,我仍然会推荐使用的UnitOfWork模式,我将张贴链接到文章再次解释它。 实施可能会有所不同,但通常可以解决大部分的你的问题(与此类似)。

这种方法的好处是,如果你使用正确的话,你可以建立一个小的框架,你可以在所有的EF项目的时候重新使用。



Answer 4:

  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!


文章来源: How to delete an associated object in Entity Framework without having access to the object context