Entity Framework 6: удаление объекта с отношением «многие ко многим» - PullRequest
0 голосов
/ 15 апреля 2019

Я использую 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.Infrastructure.DbUpdateException: 'Ошибка произошло при сохранении сущностей, которые не выставляют внешний ключ свойства для их отношений. Свойство EntityEntries будет вернуть ноль, потому что один объект не может быть идентифицирован как источник исключения. Обработка исключений при сохранении может быть сделано проще, выставляя свойства внешнего ключа в ваших типах сущностей. Увидеть InnerException для деталей. '

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...