1

有两个模型,Site 和 Link,其中一个站点有许多链接,我如何从 Site 的方法中删除一个链接,它无法访问对象上下文?

我试过类似的东西:

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

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

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

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

4

4 回答 4

1

假设您在调用 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();
  }
}
于 2010-01-20T12:30:45.083 回答
0

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

但是,作为一个长期的解决方案,我仍然会推荐使用 UnitOfWork 模式,并且我会再次发布文章的链接来解释它。实现可能会有所不同,但总的来说它可能会解决您的大部分问题(类似于这个)。

这种方法的美妙之处在于,如果正确使用它,您可以构建一个小型框架,以后可以在所有 EF 项目中重用该框架。

于 2010-01-20T10:38:15.340 回答
0

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

于 2010-01-19T23:44:46.420 回答
0
  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!
于 2012-09-24T07:00:57.787 回答