2011-04-16 74 views
7

我試圖從實體框架中的集合中刪除對象,但不幸的是我的代碼失敗。如果你能看一看,並且讓我知道,如果你能弄清楚我做錯了什麼,我將不勝感激。我的目標如下:刪除()不適用於實體框架中的多對多關係

  • 人< - >徽章(許多一對多關係)
  • 徽章< - > BadgeRequirement(一個一對多的關係)
  • 人包含ICollection的徽章的
  • 徽章包含人的ICollection的
  • BadgeRequirement包含徽章外鍵

添加和編輯條目工作得很好。

然而,當我嘗試使用下面的代碼一個人刪除徽章,這是行不通的:

Postback event handler on example.aspx 
****The person object has been loaded as part of the load event on the page**** 

Badge badge = BadgeHelper.getBadge(badgeID); 
if (command == "Delete") 
{ 
PersonHelper.removeBadgeFromPerson(badge, person); 
} 

Delete method on PersonHelper class (wrapper for all processing) 

person.Badges.Remove(badge); 
DbContext.SaveChanges(); 

的刪除(徽章)返回false,併爲我使用,我不能資料這個SQL Compact 4.0

在此先感謝您的幫助!

+0

可以調試你的代碼,並檢查了'person'是'Badges'集合中包含的徽章,你正試圖刪除?它是否包含任何徽章? – 2011-04-16 19:47:36

+0

嗨拉迪斯拉夫,我可以驗證person對象包含一個完全加載的徽章集合。在我的「Get」查詢中,我使用person.include(「Badges」)來確保集合被加載並相應傳遞。但是,當我嘗試從集合中刪除相關徽章時,不會執行刪除操作。相反,刪除(徽章)返回false。不知道這是否有幫助。謝謝 – Chris 2011-04-22 12:20:28

回答

14

這實際上是在其中一個MSDN論壇上解決的。可以在鏈接上找到完整的詳細信息here

但是,作爲總結,要使用Remove()方法,需要在發生任何更改之前加載多對多關係中的兩個集合。代碼示例如下所示:

class Program { 
static void Main(string[] args) 
{ 
    using (var context= new MyContext()) 
    { 
    var post1 = context.Posts.Find(3); 
    var tag1 = context.Tags.Find(2); 
    context.Entry(post1).Collection("Tags").Load(); 
    post1.Tags.Remove(tag1);   
    context.SaveChanges(); 
    } 
} 
} 
public class Post 
{ 
    public int PostId { get; set; } 
    public string PostContext { get; set; } 
    public ICollection<Tag> Tags { get; set; } 
} 
public class Tag 
{ 
    public int TagId { get; set; } 
    public string TagContext { get; set; } 
    public ICollection<Post> Posts { get; set; } 
} 
public class MyContext:DbContext 
{ 
    public DbSet<Post> Posts { get; set; } 
    public DbSet<Tag> Tags { get; set; } 
} 

我希望這可以幫助有類似問題的人。

3

有同樣的問題,我最終只執行一個原始的SQL命令,對聯接表:

DbContext.Database.ExecuteSqlCommand("DELETE FROM [dbo].[Badges_Persons] WHERE Badge_Id=5000 AND Person_Id=1000"); 
DbContext.SaveChanges(); 
+4

你不應該執行原始的SQL命令。 – PussInBoots 2016-03-20 10:36:19