Как предотвратить неправильное соединение EF Core между сущностями - PullRequest
0 голосов
/ 09 июля 2019

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

1 Ответ

1 голос
/ 10 июля 2019

Все, что мне нужно было сделать, это сказать 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>();
}
...