Entity Framework Core: доступ к родительскому элементу от дочернего элемента - PullRequest
2 голосов
/ 29 мая 2019

Возможно, это глупый вопрос, но я немного запутался здесь.

У меня есть родительский объект, который содержит список детей.

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 к дочернему элементу в сущности, но я действительно не хочу, чтобы это свойство назначалось вручную. И если я установлю его только для чтения, указав только метод получения, миграция больше не будет работать.

Ответы [ 3 ]

3 голосов
/ 29 мая 2019

EF Core позволяет получить доступ к связанному теневому свойству в запросе LINQ to Entities, используя метод EF.Property :

Адреса заданного свойства в экземпляре объекта. Это полезно, когда вы хотите сослаться на свойство состояния тени в запросе LINQ. В настоящее время этот метод может использоваться только в запросах LINQ и не может использоваться для доступа к значению, назначенному свойству в других сценариях.

Все, что вам нужно знать, это имя и тип - в вашем случае это "ParentId" и int? (необязательно):

var result = model.Child.Where(child => EF.Property<int?>(child, "ParentId") == 3);
2 голосов
/ 29 мая 2019

Я бы порекомендовал вам иметь ссылки (child-parent и parent-children) в соответствующих классах, как указано в ответе @ScotG.

Однако, так как вы этого не хотите, в EF с использованием отложенной загрузки вы можете сделать что-то вроде model.Parents.Find(3).Children, так как из класса Parent у вас есть ссылки на его дочерние элементы.

0 голосов
/ 29 мая 2019
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

...