Может быть глупый вопрос, но я немного запутался здесь.
У меня есть родительский объект, который содержит список дочерних элементов.
public class Parent
{
public int Id { get; set; }
public List<Child> Children { get; set; }
}
public class Child
{
public int Id { get; set; }
}
EFcore создаст ParentId
в качестве внешнего ключа в таблице Child
.
Теперь предположим, что я хочу получить всех дочерних элементов, у которых есть определенный родитель, как мне это сделать? ParentId
недоступен в объекте Child
.
Поэтому я не могу сделать что-то вроде:
var result = model.Child.Where(child => child.ParentId == 3);
Я мог бы добавить свойство ParentId
дочернему объекту, но я действительно не хочу, чтобы это свойство назначалось вручную. И если я установлю его только для чтения, указав только геттер, миграция больше не будет работать.
Нет, потому что я использую идентификатор детей, чтобы найти детей. Только после этого я должен проверить, что дети действительно принадлежат родителю. Кроме того, я не хочу запрашивать всех детей, только одного.
EF Core позволяет получить доступ к связанному теневое свойство в запросе LINQ to Entities с помощью метода EF.Property:
Addresses a given property on an entity instance. This is useful when you want to reference a shadow state property in a LINQ query. Currently this method can only be used in LINQ queries and can not be used to access the value assigned to a property in other scenarios.
Все, что вам нужно знать, это имя и тип — в вашем случае это «ParentId» и int?
(необязательно):
var result = model.Child.Where(child => EF.Property<int?>(child, "ParentId") == 3);
Вы также можете сделать model.Child.Where(child => child.Parent.Id == 3)
, сгенерированный sql все равно будет использовать ParentId
.
@ jeuxjeux20 Конечно, будет, но свойство навигации если естьChild.Parent
. Рассматриваемая модель не имеет ни навигации, ни явного свойства FK, поэтому EF.Property
является единственным решением для такого типа модели.
public class Child
{
public int Id { get; set; }
// add these navigation properties to access the Parent
public int ParentId {get; set; }
public Parent Parent {get; set; }
}
https://www.learnentityframeworkcore.com/conventions/one-to-many-relationship
Почему и ParentId, и Parent? Как упоминалось выше, я хотел бы избежать возможности вручную устанавливать эти свойства в коде.
Я бы порекомендовал вам иметь обе ссылки (дочерний-родительский и родительский-дочерний) в соответствующих классах, как указано в ответе @ScotG.
Однако, поскольку вы этого не хотите, в EF с отложенной загрузкой вы можете сделать что-то вроде model.Parents.Find(3).Children
, поскольку из родительского класса у вас есть ссылки на его дочерние элементы.
есть ли причина, по которой вы не можете использовать сам родитель для поиска дочерних элементов.. что-то вроде ..
model.parents.Single(p=> p ==3).Children
?