[英]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();
}
}
要使用實體,以便使修改反映在數據庫中,您必須在對象上下文中(根據數據庫上下文中的EF5) 添加/附加這些實體,然后使用方法SaveChanges提交更改。
是的,在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(); } }
. 幸運的是,現在有EF5允許從父集合中刪除,但前提是關系是 。
using(DatabaseContext context = new DatabaseContext) { Link linkToDelete = context.Links.FirstOrDefault(); if(linkToDelete != null) { context.Links.Remove(linkToDelete); context.SaveChanges(); } }
沒有對象上下文,您無法從數據庫中刪除任何內容。 所有操作都在對象上下文的狀態管理器中排隊,並且在您調用ObjectContext.SaveChanges()
時將這些操作持久化到數據庫中。 沒有SaveChanges,就不會更改數據庫。
首先,如果您可以發布有關類結構的更多信息,那就太好了。 Site類是否具有ObjectContext對象? 然后,作為快速解決方案,您可以將其傳遞到delete方法中,並使用context.DeleteObject()方法,然后再調用SaveChanges。
但是,作為長期解決方案,我仍然建議使用UnitOfWork模式,並且將鏈接發布到再次解釋它的文章上 。 實現可能有所不同,但通常它可以解決大多數問題(類似於此問題)。
這種方法的優點在於,如果正確使用它,則可以構建一個小的框架,以后可以在所有EF項目中重用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.