【发布时间】:2019-08-15 19:46:33
【问题描述】:
我目前有名为 Job(父实体)和 Attachment(子实体,具有非对多关系)的实体。 Attachment 实体有一个名为 IsDeleted 的布尔属性,因此我可以使用它来“删除”用户所关心的数据,但实际上,将其原封不动地保留在数据库中。当然,这意味着我需要确保我的查询不包括正确的子实体。
我不知道如何使用 .Include 来获取大部分附件,但故意排除 IsDeleted == true 的附件
这些实体的模型如下:
public class Job
{
public int Id { get; set; }
public string Title { get; set; }
public List<Attachment> Attachments { get; set; }
}
public class Attachment
{
public int Id { get; set; }
public string Filename { get; set; }
public bool IsDeleted { get; set; }
}
如何在数据库上下文中查询 Jobs 实体,使其包含所有附件,但不包含 IsDeleted == true 的附件?
例如,如果我使用以下查询(我知道 16 是我需要的记录的 id):
var tmpJob = context.Jobs
.Include(j => j.Attachments)
.Where(j => j.Id == 16)
.FirstOrDefault()
这给了我所有的附件,包括被删除的。
但我似乎无法做类似的事情 .Include(j => j.Attachments.Where(a => a.IsDeleted == false) 因为那根本行不通。
我什至考虑过手动删除项目的解决方法,例如:
var attachments = new List<Attachment>();
foreach (var attachment in tmpJob.Attachments)
{
if (!attachment.IsDeleted)
attachments.Add(attachment);
}
tmpJob.Attachments = attachments;
不幸的是,如果我这样做,并且稍后我对 tmpJob 实体进行更改(并对其执行 context.SaveChanges),那么它会完全删除 Job 和 Attachment 之间的 FK 关系,这样就行不通了要么。
我以为我在某处看到我想要的东西在 Entity Framework 中(当前)不支持(2.1 是我正在使用的版本),但即使是这样,我也不知所措甚至是可接受的解决方法。
【问题讨论】:
-
使用global query filter怎么样?您的场景是该功能的目标使用案例之一。