【问题标题】:Entity Framework Navigation Collection Property Delete实体框架导航集合属性删除
【发布时间】:2016-09-03 04:30:38
【问题描述】:

我有两个实体如下:

public class FirstEntity
{
    public int Id { get; set; }

    public ICollection<SecondEntity> SecondEntityCollection { get; set; }
}

public class SecondEntity
{
    [Key]
    [Column(Order = 0)]
    public int FirstEntitySomeId { get; set; }

    [Key]
    [Column(Order = 1)]
    public int SecondEntityId { get; set; }
}

我的ModelBuilder设置如下

modelBuilder.Entity<FirstEntity>()
            .HasMany(x => x.SecondEntity)
            .WithRequired()
            .HasForeignKey(x => x.FirstEntitySomeId);

删除FirstEntity 对象时,我执行以下操作:

var firstEntity=this.context.FirstEntities.Where(x=>x.Id==someId);
firstEntity.SecondEntityCollection.Clear();
this.context.FirstEntities.Remove(firstEntity);
this.context.SaveChanges();

但是我仍然得到以下异常:

DELETE 语句与 REFERENCE 约束“....”冲突。冲突发生在数据库“Database”、表“dbo.SecondEntity”、列“FirstEntitySomeId”中。

如何在删除firstEntity 对象之前正确清除集合?

值得一提的是,我正在尝试避免级联删除。我确实想删除数据库中的孤立条目。但是,如果最好的解决方案/做法是使用级联删除,我会使用它。

这可能吗?

【问题讨论】:

  • I am trying to avoid cascade deleting :这是否意味着您需要将孤立数据保留在数据库中?
  • 不,我还想删除集合中的子条目。我只是想暂时避免使用WillCascadeOnDelete()。但是,如果这是最好的选择,我会使用它。

标签: c# entity-framework-6


【解决方案1】:

你可以试试如下图。

var firstEntity=this.context.FirstEntities
                       .Where(x=>x.Id==someId)
                       .Include(s => s.SecondEntityCollection);

this.context.FirstEntities.Remove(firstEntity);

foreach (var s in firstEntity.SecondEntityCollection.ToList())
  {
     this.context.SecondEntityCollection.Remove(s);
  }

this.context.SaveChanges();

【讨论】:

  • firstEntity.SecondEntityCollection.Count() 为 0,这意味着没有删除 SecondEntity 子级。我不知道为什么SecondEntityCollection 是空的。
  • 对不起,我没听懂你说的?这是有效还是有任何问题?
  • 对不起,我不够清楚。 firstEntity.SecondEntityCollection.ToList() 返回一个空集合 - 因此不会发生删除,因为 SecondEntityCollection 内没有项目。
  • 工作就像一个魅力,欣赏! :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-29
  • 2016-05-29
相关资源
最近更新 更多