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() 不适用于实体框架中的多对多关系的主要内容,如果未能解决你的问题,请参考以下文章