【问题标题】:How to prevent EF Core from making an incorrect join between entities如何防止 EF Core 在实体之间进行不正确的连接
【发布时间】:2019-11-19 10:37:47
【问题描述】:

我需要以某种方式显式忽略复杂类型的“深度”导航属性或显式告诉 EF 如何加入

我正在做一个简单的用户选择并映射到一个平面视图模型(我显然已经为 ProjectTo 设置了相关映射):

return await DataContext.Users
    .ProjectTo<UserModel>()
    .ToListAsync();

public class User {
    public int PersonId { get; set; }       
    public Person Person { get; set; }
}
public class Person {
    public int Id { get; set; }     
    public int DeptartmentId { get; set; }      
    public Department Department { get; set; }
}
public class Department {
    public int Id { get; set; }     
    public int DeptartmentHeadId { get; set; }      
    public Person DepartmentHead { get; set; }
}
public class UserSummary
{
    public Guid Id { get; set; }
    public string UserName { get; set; }
    public string Name { get; set; }
    public string DepartmentName { get; set; }
}

像这样覆盖 OnModelCreating 方法适用于这种情况,但显然会一直排除 OwnerPerson,我们只想排除 从数据库中选择用户实体并将其映射到用户模型时:

builder.Entity<Department>().Ignore(x => x.DepartmentHead);

我需要做类似的事情:

builder.Entity<User>().Ignore(x => x.Person.Department.DepartmentHead);

使用 SQL Profiler,您可以看到它在部门上创建了意外的联接:

 SELECT * FROM [Users] AS [x] 
 INNER JOIN [dbo].[People] AS [x.Person]
 ON [x].[PersonId] = [x.Person].[Id] 
 LEFT JOIN [Departments] AS [x.Person.Department] 
 ON [x.Person].[Id] = [x.Person.Department].[DeptartmentHeadId]

我想要的是:

 SELECT * FROM [Users] AS [x] 
 INNER JOIN [dbo].[People] AS [x.Person]
 ON [x].[PersonId] = [x.Person].[Id] 
 LEFT JOIN [Departments] AS[x.Person.Department] 
 ON [x.Person].[DepartmentId] = [x.Person.Department].[Id]

【问题讨论】:

  • 这看起来像是不正确的关系映射。我们能看到流畅的配置吗?
  • @IvanStoev - 感谢您的评论,让我意识到如何解决...请参阅下面的答案。

标签: entity-framework entity-framework-core entity-framework-core-2.2


【解决方案1】:

我需要做的就是告诉 EF 部门有人员(因此修复了关系映射):

public class Department {
    public int Id { get; set; }     
    public int DeptartmentHeadId { get; set; }      
    public Person DepartmentHead { get; set; }

    [InverseProperty(nameof(Person.Department))]
    public IList<Person> People { get; set; } = new List<Person>();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-17
    • 2019-08-09
    • 1970-01-01
    • 2015-05-11
    • 2020-05-15
    相关资源
    最近更新 更多