【问题标题】:Deleting parent Entities without deleting related child删除父实体而不删除相关子实体
【发布时间】:2013-10-22 23:05:19
【问题描述】:

您好,我正在使用实体框架来设置我的数据库。我有一对多的关系实体,我只想删除父实体而不进行级联删除。我从父母那里删除时出错,但我真的想把我的孩子作为录音的原因。有什么方法可以只删除父母而不会出错?

【问题讨论】:

  • stackoverflow.com/questions/5048561/…stackoverflow.com/questions/9136255/… ,也许。尝试搜索“on delete set null”(在 EF 中本身不存在,但应该会导致类似的解决方案)
  • 感谢您的回复,所以我对子实体使用了“on delete set null”,但是当我删除父实体时,整个子实体被删除,而不仅仅是子实体的外键。还是卡住了..

标签: c# entity-framework cascade


【解决方案1】:

这是一个老问题,但我今天遇到了这个问题,所以我将分享我找到的解决方案。

长话短说,您需要预先加载您的子关联。假设您的关系设置正确并且Foo 有许多Bars,则此代码应该完全符合您的要求:

    public void Delete(Guid fooId)
    {
        using (var context = new MyDbContext())
        {
            var foo = context.Foos.Include("Bars").FirstOrDefault(foo => foo.Id == fooId);
            if (foo != null)
            {
                context.Foos.Remove(foo);
                context.SaveChanges();
            }
        }
    }

这里的关键是调用.Include。否则,更新将因外键违规而失败。

现在,当我说我假设你的关系设置正确时,我的意思是它们应该看起来像这样。

// Foo.cs
public class Foo
{
    public Guid Id { get; set; }

    public ICollection<Bar> Bars { get; set; }
}

// Bar.cs
public class Bar
{
    public Guid Id { get; set; }

    public Guid? FooId { get; set; }

    public virtual Foo Foo { get; set; }
}

// MyDbContext
modelBuilder.Entity<Foo>()
    .HasMany(e => e.Bars)
    .WithRequired(e => e.Foo)
    .HasForeignKey(e => e.FooId)
    .WillCascadeOnDelete(false);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-20
    • 2018-12-04
    • 1970-01-01
    • 2021-04-04
    • 1970-01-01
    • 2017-10-31
    • 2019-07-09
    相关资源
    最近更新 更多