C# 当子实体被ef core标记为已删除时,无法获取父实体
我正在使用ef core 2.0访问Sql Server数据库。这个项目有一个基本的软删除要求,所以我为所有实体定义了一个过滤器,如下所示:C# 当子实体被ef core标记为已删除时,无法获取父实体,c#,entity-framework,asp.net-core,entity-framework-core,ef-core-2.0,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<Empl
protected override void OnModelCreating(ModelBuilder modelBuilder) {
modelBuilder.Entity<Company>().HasQueryFilter(e => !e.IsDeleted);
modelBuilder.Entity<Employee>().HasQueryFilter(e => !e.IsDeleted);
...
}
因此,如果关联的公司将IsDeleted属性标记为true(这不是预期的行为),则此查询不会检索员工。我想要的是将Company设置为null的员工
提前感谢。这篇文章的标题是误导性的,因为从关系的角度来看,
公司
实体是母公司(也称为委托人、所有者、参考人),员工
是子公司(也称为从属、拥有、参考人)
你所问的仍然是可能的,但前提是关系是,即依赖实体可以在没有主体实体的情况下存在。在您的情况下,它是必需的,因为FK属性类型不允许空值,所以要使其成为可选的,您需要将FK属性类型更改为相应的可空类型:
public partial class Employee
{
public Guid Id { get; set; }
public Guid? CompanyId { get; set; } // <--
public Company Company { get; set; }
}
公共部分类员工
{
公共Guid Id{get;set;}
public Guid?CompanyId{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();
从关系的角度来看,Company
是父公司,Employee
是子公司。因此,不检索已删除公司的员工是正常的。由于实体不是真正删除的,而是只有带有“isDeleted”标志的softdeleted,因此唯一合适且正确的答案是MustafaOmar发布的答案。Your.HasQueryFilter(e=>!e.IsDeleted)将被每个选择应用,因此您需要禁用它。请更新您的答案以接受正确的答案。
public partial class Employee
{
public Guid Id { get; set; }
public Guid? CompanyId { get; set; } // <--
public Company Company { get; set; }
}
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();