Entity Framework 6: удалить объект с отношением «многие ко многим»

#c# #entity-framework-6

#c# #entity-framework-6

Вопрос:

Я использую Entity Framework 6, и у меня есть следующие объекты

 public class Entity1
{
   [Key]
   [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
   public int Id { get; set; }

   public virtual ICollection<Entity3> Entities3 { get; set; }

   public virtual Entity2 Entity2 { get; set; }
}

public class Entity2
{
   [Key]
   [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
   public int Id { get; set; }

   public virtual ICollection<Entity3> Entities3 { get; set; }
}

public class Entity3
{
   [Key, Column(Order = 0)]
   [ForeignKey("Entity2")]
   public int Entity2_Id { get; set; }
   public virtual ICollection<Entity2> Entities2 { get; set; }

   [Key, Column(Order = 1)]
   [ForeignKey("Entity1")]
   public int Entity1_Id { get; set; }
   public virtual ICollection<Entity1> Entities1{ get; set; }

   [Key, Column(Order = 2)]
   public DateTime Timestamp { get; set; }
}
 

Я пытаюсь удалить Entity1 таким образом:

 private void DeleteEntity1(int id)
{
   var ent1 = dataContext.Entities1.Include(x=>x.Entities3).FirstOrDefault(x=>x.Id == id);
   var entities3 = ent1.Entities3.ToList();
   foreach(var entity3 in entities3)
   {
      entity3.Entities2.Clear();
      entity3.Entities1.Clear();
      dataContext.Entities3.Remove(entity3);
   }
   dataContext.Entities1.Remove(entity);
   dataContext.SaveChanges();
}
 

dataContext.Entites1 есть DbSet<Entity1> и похожие dataContext.Entities3 есть DbSet<Entity3> .

Если Entity1 существует без какой-либо связи с Entity2 и Entity3, я могу удалить Entity1.

Но если Entity3 существует, то DataContext.SaveChanges выдает исключение:

System.Data.Entity.Инфраструктура.DbUpdateException: «Произошла ошибка при сохранении объектов, которые не предоставляют свойства внешнего ключа для своих отношений. Свойство EntityEntries вернет значение null, поскольку один объект не может быть идентифицирован как источник исключения. Обработку исключений при сохранении можно упростить, предоставив свойства внешнего ключа в ваших типах сущностей. Подробности см. В InnerException.’

Внутреннее исключение:

Исключение OptimisticConcurrencyException: оператор обновления, вставки или удаления хранилища повлиял на неожиданное количество строк (0). Объекты могли быть изменены или удалены с момента загрузки объектов.

Внутреннее исключение имеет один StateEntries из типов RelationshipEntry : EntitySet: Entity3_Entity2

Не уверен, как правильно удалить Entity1.

Комментарии:

1. Удалите все записи, связанные с Entity1. Entity1 также должен иметь ссылки на объекты, привязанные к нему, поэтому возьмите связанные объекты и удалите их.

2. вы должны были указать все это CASCADE в конфигурациях сущностей

3. Я пытался указать каскадное удаление в конфигурациях объектов. В базе данных я могу удалить Entity3, но если с EF у меня все еще есть то же исключение.