Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当子实体被ef core标记为已删除时,无法获取父实体_C#_Entity Framework_Asp.net Core_Entity Framework Core_Ef Core 2.0 - Fatal编程技术网

C# 当子实体被ef core标记为已删除时,无法获取父实体

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

我正在使用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);
    ...
}
因此,如果关联的公司将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();