当使用ef核心标记删除子项时,无法获取父实体

时间:2018-01-15 18:24:05

标签: c# entity-framework asp.net-core entity-framework-core ef-core-2.0

我使用ef core 2.0访问Sql Server数据库。这个项目有一个基本的软删除要求,所以我已经为所有实体定义了一个过滤器,如下所示:

protected override void OnModelCreating(ModelBuilder modelBuilder) {
    modelBuilder.Entity<Company>().HasQueryFilter(e => !e.IsDeleted);
    modelBuilder.Entity<Employee>().HasQueryFilter(e => !e.IsDeleted);
    ...
}

上述类别定义如下:

public partial class Employee
{
    public Guid Id { get; set; }
    public Guid CompanyId { get; set; }
    public Company Company { get; set; }
}

public partial class Company
{
    public Guid Id { get; set; }
    public ICollection<Employee> Employee { get; set; }
}

然后,我试图获取员工(或单个员工)的列表,如果关联公司将IsDeleted设置为true,则不会检索该员工。

查询如下:

var query = context.Employee
                   .Include(i => i.Company)
                   .Include(i => i.EmployeeType)
                   .Include(i => i.EmployeeEquipment)
                      .ThenInclude(w => w.Equipment)
                   .Where(i => i.Id == (Guid) id);
var employeeFiltered =  await query.FirstOrDefaultAsync();

因此,如果公司关联的标记为IsDeleted属性为true而不是预期的行为,则此查询不会检索该员工。我想要的是将Employee with Company设置为null。

提前致谢。

2 个答案:

答案 0 :(得分:2)

帖子标题具有误导性,因为从关系角度Company实体是(又名校长,所有者,被引用),Employee孩子< / em>(又名依赖,拥有,引用)。

你所问的仍然是可能的,但前提是关系是optional,即依赖实体可能在没有主体的情况下存在。在你的情况下,它是必需的因为FK属性类型不允许空值,所以为了使它可选,你需要将FK属性类型更改为相应的可空类型:

public partial class Employee
{
    public Guid Id { get; set; }
    public Guid? CompanyId { get; set; } // <--
    public Company Company { get; set; }
}

答案 1 :(得分:1)

您可以像这样将value: null status: "failed" error: OSF.DDA.Error name: "GenericSettingsError" message: "An internal error has occurred." code: 9019 添加到查询中。

   <Host Name="Mailbox" />
 </Hosts>
 <Requirements>
   <Sets>
     <Set Name="Mailbox" MinVersion="1.1" />
   </Sets>
 </Requirements>