实体框架6:删除具有多对多关系的实体

时间:2019-04-15 13:06:32

标签: 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.Entites1DbSet<Entity1>,类似的dataContext.Entities3DbSet<Entity3>

如果Entity1存在,但与Entity2和Entity3没有任何关系,则可以删除Entity1。

但是,如果Entity3存在,则dataContext.SaveChanges会引发异常:

  

System.Data.Entity.Infrastructure.DbUpdateException:'一个错误   保存不公开外键的实体时发生   关系的属性。 EntityEntries属性将   返回null,因为无法将单个实体标识为源   的例外。可以在保存时处理异常   通过在实体类型中公开外键属性,可以更轻松地进行操作。看到   有关详细信息,请参见InnerException。”

内部异常:

  

OptimisticConcurrencyException:存储更新,插入或删除   语句影响了意外的行数(0)。实体可能有   自加载实体以来已被修改或删除。

内部异常具有一个StateEntries类型的RelationshipEntryEntitySet: Entity3_Entity2

不确定如何正确删除Entity1。

0 个答案:

没有答案