删除父实体而不删除相关子项

时间:2013-10-22 23:05:20

标签: c# entity-framework cascade

您好我正在使用Entity框架来设置我的数据库。我有一个多关系实体,我想只删除父实体而没有级联删除。从父母那里删除我会收到错误,但我真的想让我的孩子成为录音原因。有没有办法只删除没有错误的父母?

1 个答案:

答案 0 :(得分: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);