Проблема в том, что у вас не может быть свойств навигации между Company
и Identifier
, поскольку ни DefaultIdentifierId
в Company
, ни DefaultIdentifierId
в Identifier
не являются первичными ключами. (В Identifier
это только часть ключа.) Однако вы можете смоделировать отношения «один ко многим» между Company
и Person
и между Person
и Identifier
. Таким образом, вы можете попробовать эти классы моделей:
public class Person
{
public int Id { get; set; }
public int CompanyId { get; set; }
public Company Company { get; set; }
public bool Deleted { get; set; }
}
public class Company
{
public int Id { get; set; }
public int DefaultIdentifierId { get; set; }
}
public class Identifier
{
[Key, Column(Order = 1)]
public int PersonId { get; set; }
[Key, Column(Order = 2)]
public int DefaultIdentifierId { get; set; }
public string IdentifierString { get; set; }
public Person Person { get; set; }
}
public class MyContext : DbContext
{
public DbSet<Person> People { get; set; }
public DbSet<Company> Companies { get; set; }
public DbSet<Identifier> Identifiers { get; set; }
}
Id в имени DefaultIdentifierId
из Company
вводит в заблуждение. В этой модели это свойство является простым скалярным свойством, а не свойством внешнего ключа, которое принадлежит любому свойству навигации.
Для выполнения требуемого запроса вам нужно будет использовать Join
в LINQ, поскольку вы не можете перейти от Company
к Identifier
через свойства навигации:
int companyId = 1;
string identifierString = "ABC";
List<int> personIds = context.Identifiers
.Join(context.Companies,
i => i.DefaultIdentifierId,
c => c.DefaultIdentifierId,
(i, c) => new { i, c })
.Where(a => a.c.Id == companyId
&& a.i.IdentifierString == identifierString
&& !a.i.Person.Deleted)
.Select(a => a.i.Person.Id) // or a.i.PersonId should work as well
.ToList();
Результат не обязательно уникален, но список личностей.