2010-01-19 56 views
1

有兩種型號,網站和鏈接,其中一個網站有許多環節,如何從網站的方法刪除裏面的一個環節,它沒有按」無法訪問對象上下文?如何刪除在實體框架相關的對象,而不必訪問對象上下文

我已經試過類似:

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

,但似乎並沒有真正刪除鏈接,但打破了關聯。因爲有一個數據庫約束它拋出這個錯誤:

A relationship is being added or deleted from an AssociationSet 'Sites_have_Links'. With cardinality constraints, a corresponding 'Links' must also be added or deleted.

如何真正從數據庫中刪除的鏈接?

回答

0

你不能沒有對象上下文從數據庫中刪除任何東西。所有操作都在對象上下文的狀態管理器中排隊,當您撥打ObjectContext.SaveChanges()時,這些操作會持久保存到數據庫中。如果沒有SaveChanges,則不會更改數據庫。

+0

我很好的動作是排隊的,我只是希望能夠從方法內部排隊它們的實體。 – Pablo 2010-01-20 01:31:25

0

首先,這將是巨大的,如果你可以發佈你的類結構提供更多的信息。 Site類是否有ObjectContext對象?然後作爲一個快速解決方案,您可以將它傳遞給delete方法並使用context.DeleteObject()方法,然後調用SaveChanges。

然而,作爲一個長期的解決方案,我仍然會推薦使用UnitOfWork模式,我會發布鏈接到article再次解釋它。實現可能會有所不同,但通常它可能會解決大部分問題(與此類似)。

這種方法的好處是,如果你使用正確的話,你可以建立一個小的框架,你可以在所有的EF項目的時候重新使用。

+0

不,網站實體沒有ObjectContext,爲什麼要這樣呢? – Pablo 2010-01-20 11:14:43

+0

那麼,你如何管理ObjectContext呢?由EF生成的網站和鏈接實體?他們是繼承EntityObject還是使用POCO類?您是否通過在單獨的文件中使用部分類來擴展網站? – Yakimych 2010-01-20 12:12:45

+0

是的,網站和鏈接是由EF生成的實體。我想他們繼承了EntityObject,但我必須檢查。我在Site的單獨文件中使用了部分類,也許有Link(對不起,現在不在代碼前面),但是如果沒有,我可以製作它們。 – Pablo 2010-05-22 12:48:39

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

我真的好奇,這是否工作?我不是說它曾經工作過一次,我的意思是它運行良好,不會在邊緣情況下爆炸。 – Pablo 2010-05-22 12:49:39

+0

我不明白爲什麼它不起作用。你需要ObjectContext來刪除一個實體,這樣你可以旋轉一個實體,附加實體,然後調用「DeleteObject」方法。 你是什麼意思的「邊緣案件」,順便說一句? – Yakimych 2010-05-26 12:20:27

0
  1. 要與實體工作,所以這些修改都反映在你必須添加/ ATTACH這些在對象上下文的實體(在數據庫上下文EF5而言),然後使用方法的SaveChanges 提交修改數據庫。

  2. 是,在EF4以去除物理性SQL表(而不是鏈接)的記錄,您需要使用方法DeleteObject的對象的ObjectContext然後的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!
相關問題