簡體   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