如何防止 EF Core 在实体之间进行不正确的连接
How to prevent EF Core from making an incorrect join between entities
我需要以某种方式明确忽略复杂类型的 "deep" 导航 属性 或明确告诉 EF 如何加入
我正在做一个简单的 select 用户并映射到平面视图模型(我显然已经为 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,我们只想排除
当 select 从数据库中获取用户实体并将其映射到 UserModel 时:
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]
我需要做的就是告诉 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>();
}
我需要以某种方式明确忽略复杂类型的 "deep" 导航 属性 或明确告诉 EF 如何加入
我正在做一个简单的 select 用户并映射到平面视图模型(我显然已经为 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,我们只想排除 当 select 从数据库中获取用户实体并将其映射到 UserModel 时:
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]
我需要做的就是告诉 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>();
}