2011-04-16 57 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