我正在使用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属性将 返回null,因为无法将单个实体标识为源 的例外。可以在保存时处理异常 通过在实体类型中公开外键属性,可以更轻松地进行操作。看到 有关详细信息,请参见InnerException。”
内部异常:
OptimisticConcurrencyException:存储更新,插入或删除 语句影响了意外的行数(0)。实体可能有 自加载实体以来已被修改或删除。
内部异常具有一个StateEntries
类型的RelationshipEntry
:
EntitySet: Entity3_Entity2
不确定如何正确删除Entity1。