防止删除子记录以删除父记录

时间:2016-08-10 14:17:10

标签: c# sql-server entity-framework entity-framework-6

我有一个电子邮件服务,可以将电子邮件请求存储在数据库中(由于遗留原因)。有两个实体,即EmailRequest

public class EmailRequest
    {
        [Key]
        public Guid ID { get; set; }
        public bool Sent {get; set;
        //Other props
        public virtual List<Attachment> Attachments { get; set; }
    }

给定电子邮件的附件

public class Attachment
{
    [Key]
    public Guid Id { get; set; }
    //Other props
    public virtual EmailRequest EmailRequest { get; set;}

}

插入数据库工作正常 - 电子邮件记录位于“父”表中,零对多附件插入附件的“子”表中。 当电子邮件发送完毕后,我想更新父表中的已发送标志并删除任何附件,因为它们只是浪费空间。但是,当我调用

时,在我的DBContext类中
Attachments.RemoveRange(Attachments.Where(a => a.EmailRequest.ID == identifier));

删除所有附件,但也删除父(EmailRequest)。 是什么原因引起了这个?我已经关闭了级联删除,因为我正在删除子记录而不是父级记录,因此我没有做任何事情。但是,我不知道如何告诉实体框架(6.1.3)不要删除父代。

有什么想法吗?

修改

正如评论中所建议的那样,看起来EF本身并不执行删除,因为如果我进入SSMS并从附件表中删除,它也会删除父项。这里必须是实体中的东西。

编辑2

因此,如果我使用request.attachments.clear()而不是Attachments.RemoveRange(),它会清除父级(以及附件中的外键引用),但会保留附件,因此与我想要的完全相反!< / p>

1 个答案:

答案 0 :(得分:0)

如果你能看到差异我首先抓住父实体然后删除他的子集合。您直接删除子实体的位置。我无法看到在这个实例中如何删除父实体,因为它正好位于内存中供您查看。如果确实如此,那么我会检查我的数据库约束,以确定实体框架是否添加了不需要的约束。

using (var context = new MyContext())
{
    var parent = context.Parents.Include(p => p.Children)
    .SingleOrDefault(p => p.Id == parentId);

    foreach (var child in parent.Children.ToList())
    context.Children.Remove(child);

    context.SaveChanges();
}

我希望上面的方法为您提供更多调试选项或者只是消除了问题。我还添加了一个链接,让您检查实体框架生成的SQL以获取更多调试选项(见下文)

How do I view the SQL generated by the Entity Framework?