Требует ли EF code-first свойств навигации для удаления отношений «многие ко многим»? - PullRequest
0 голосов
/ 08 апреля 2011

У меня есть два POCO, участвующих в отношениях многих ко многим.«A» имеет коллекцию «B», но для «B» нет необходимости иметь коллекцию «A».Когда я удаляю «B», записи в таблице Join не удаляются.Похоже, что Entity Framework code-first удаляет записи Join только при наличии свойства Navigation.Это правильно или есть другой способ?

Пример:

public class User() { 
   public int Id { get; set; }
   public string Name { get; set; }
   public List<Role> Roles { get; set; }
}

public class Role() { 
   public int Id { get; set; }
   public string Name { get; set; }
}

//... Mapping Config ...//
this.HasMany(x => x.Roles)
   .WithMany(/*can't be expressed without navigation property*/)
   .Map(m => {
      m.MapLeftKey("Users_Id");
      m.MapRightKey("Roles_Id");
      m.ToTable("UserRoleLinks");
   });

//... Deleting a Role that is in use ...//
using(var ctx = new MyDbContext()) {
    var role = ctx.Roles.Find(1);
    ctx.Roles.Remove(role);
    ctx.SaveChanges();
}

В этом случае записи UserRoleLinks будут потеряны при удалении роли.Мэйби, есть другой способ его настройки?

1 Ответ

1 голос
/ 08 апреля 2011

Это должно работать без проблем. Значение по умолчанию ManyToManyCascadeDeleteConvention заставит EF создать соединительную таблицу со связями с использованием каскадного удаления. Отсутствующее свойство навигации в сущности Role не влияет на это.

Итак, возможные причины вашей проблемы:

  • Вы удалили упомянутое соглашение
  • Вам не хватает каскадных удалений для отношений в соединительной таблице - это может произойти, например, при использовании Fluent API с существующей базой данных.
...