Remove() 不适用于实体框架中的多对多关系

Posted

技术标签:

【中文标题】Remove() 不适用于实体框架中的多对多关系【英文标题】:Remove() doesn't work with many-to-many relationship in Entity Framework 【发布时间】:2011-04-16 19:16:10 【问题描述】:

我正在尝试从实体框架中的集合中删除一个对象,但不幸的是我的代码失败了。如果你能看看,如果你能弄清楚我做错了什么,我将不胜感激。我的对象如下:

人员 徽章(多对多关系) 徽章 BadgeRequirement(一对多关系) Person 包含 ICollection 的徽章 徽章包含一个 ICollection 的 Person 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,所以我无法对此进行分析

提前感谢您的帮助!

【问题讨论】:

您能否调试您的代码并检查person 上的Badges 集合是否包含您要删除的徽章?它包含任何徽章吗? 嗨 Ladislav,我可以验证 person 对象是否包含一个完全加载的 Badges 集合。在我的“获取”查询中,我使用 from p in person.Include("Badges") 来确保相应地加载和传递集合。但是,当我尝试从集合中删除有问题的徽章时,不会执行任何删除操作。相反,remove(badge) 返回 false。不确定这是否有帮助。谢谢 【参考方案1】:

这实际上已在某个 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; 

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

【讨论】:

【参考方案2】:

遇到同样的问题,我最终只是对连接表执行了一个原始 SQL 命令:

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

【讨论】:

以上是关于Remove() 不适用于实体框架中的多对多关系的主要内容,如果未能解决你的问题,请参考以下文章

代码第一个约定不在实体框架6.2中的多对多关系上创建连接表

使用 SQL 和 Linq 的多对多关系(实体框架/实体)

使用实体框架中的导航属性填充多对多关系表

实体框架代码优先,同一张表上的多对多关系

实体框架6:多对多关系问题[关闭]

Entity Framework Core:与同一实体的多对多关系