Мне нужно каким-то образом либо явно игнорировать "глубокое" навигационное свойство сложного типа, либо явно указать 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, мы только хотим исключить
это при выборе сущности пользователя из БД и сопоставлении ее с 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]