Я предрек сущность, как это (фактический класс, очевидно, также имеет свойство ID, отображение делается и т.д., но это не проблема, так что я пропустил его здесь):Не поддерживает ли инфраструктура Entity Framework защищенные свойства навигации?
public class Parent
{
public virtual ICollection<Child> Children {get; set;}
}
это работает совершенное:
public class Consumer
{
void DoBusiness()
{
using (var ctx = new MyDbContext())
{
var entity = ctx.Parents.Find(keyOfParent);
// This is as expected: entity.Children refers to a collection which
// Entity Framework has assigned, a collection which supports lazy loading.
}
}
}
Теперь я изменить видимость коллекции Дети должны быть защищены:
public class Parent
{
protected virtual ICollection<Child> Children {get; set;}
}
Это приносит неожиданный результат :
public class Consumer
{
void DoBusiness()
{
using (var ctx = new MyDbContext())
{
var entity = ctx.Parents.Find(keyOfParent);
// This is NOT as expected: entity.Children is null. I would expect, that it
// had been referring to a collection which Entity Framework would have been
// assigning, a collection which should support lazy loading.
}
}
}
Кроме того, если я в ситуации, когда дети защищены попробовать явно загружающие ребенок через:
ctc.Entry(entity).Collection(x => x.Children)
Тогда я получаю это исключение:
Свойства " Дети "по типу« Родитель »не являются навигационным свойством. Методы Reference и Collection могут использоваться только с навигационными свойствами. Используйте метод Property или ComplexProperty.
Поэтому: Что я должен делать, чтобы иметь защищенное свойство навигации с использованием Entity Framework?
Почему на Земле вы хотели бы это сделать? «Объекты» в EF - это не более чем объектное представление таблиц, записей и отношений базы данных. Они не должны содержать бизнес-логику.Поэтому они и их члены должны быть видимыми для использования в запросах. Образец кода 'ctc.Entry (entity) .Collection (x => x.Children)' может запускаться только из класса 'Parent', что противоречит этим принципам. –
Поскольку конкретные свойства, соответствующие Детям в примере, используются только для размышлений, и поэтому основные соображения, которые вы даете в отношении запросов, не применяются. Что касается вашего комментария к кодировке: Да, очевидно, но это подчеркивает, что Entity Framework не рассматривает свойство как свойство навигации после того, как оно было защищено. У вас также есть какая-то информация, пожалуйста? –
Если свойство помечено 'protected', как будет реализована структура, использующая это свойство и загружающая его? Он не может «видеть» его; только дочерние классы могут. –