我试图从实体框架中的集合中删除一个对象,但不幸的是我的代码失败了。如果你能看一眼我会很高兴,如果你能弄清楚我做错了什么,请告诉我。我的目标如下:
添加和编辑条目非常合适。
但是,当我尝试使用下面的代码从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
提前感谢您的帮助!
答案 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();