繁体   English   中英

使用 ef core 将子项标记为已删除时,无法获取父实体

[英]Unable to get parent Entity when child is marked deleted with ef core

我正在使用 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,则此查询不会检索员工,这不是预期的行为。 我想要的是让公司的员工设置为空。

提前致谢。

帖子标题具有误导性,因为从关系的角度来看, Company实体是父级(又名委托人、所有者、引用),而Employee子级(又名依赖、拥有、引用)。

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

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

您可以像这样将.IgnoreQueryFilter()添加到查询中。

var query = context.Employee
               .IgnoreQueryFilter()
               .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();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM