Remove () не работает с отношением «многие ко многим» в Entity Framework - PullRequest
7 голосов
/ 16 апреля 2011

Я пытаюсь удалить объект из коллекции в Entity Framework, но, к сожалению, мой код не работает. Я был бы признателен, если бы вы могли взглянуть и дать мне знать, если вы можете понять, что я делаю неправильно. Мои объекты таковы:

  • Персона <-> Знак (отношение «многие ко многим»)
  • Badge <-> 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();

Удалить (значок) возвращает ложь, и я не могу профилировать это, поскольку я использую SQL Compact 4.0

Заранее спасибо за помощь!

Ответы [ 2 ]

14 голосов
/ 27 апреля 2011

На самом деле это было решено на одном из форумов MSDN.Полную информацию можно найти по ссылке здесь

Однако, для краткости, чтобы использовать метод 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 голосов
/ 06 ноября 2013

У меня возникла та же проблема, я просто выполнил необработанную команду SQL для таблицы соединения:

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