Remove()不适用于Entity Framework中的多对多关系

时间:2011-04-16 19:16:11

标签: entity-framework-4 many-to-many

我试图从实体框架中的集合中删除一个对象,但不幸的是我的代码失败了。如果你能看一眼我会很高兴,如果你能弄清楚我做错了什么,请告诉我。我的目标如下:

  • 人< - >徽章(多对多关系)
  • 徽章< - > BadgeRequirement(一对多关系)
  • 人物包含 ICollection 徽章
  • 徽章包含人员的 ICollection
  • BadgeRequirement包含徽章外键

添加和编辑条目非常合适。

但是,当我尝试使用下面的代码从Person中删除徽章时,它不起作用:

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();

Remove(badge)返回false,我无法对此进行分析,因为我正在使用SQL Compact 4.0

提前感谢您的帮助!

2 个答案:

答案 0 :(得分: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; }
}

我希望这可以帮助其他人解决类似问题。

答案 1 :(得分:2)

出现同样的问题,我最终只是对连接表执行原始SQL命令:

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