我有一个电子邮件服务,可以将电子邮件请求存储在数据库中(由于遗留原因)。有两个实体,即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>
答案 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以获取更多调试选项(见下文)