Я использую 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.