Как загрузить связанные объекты на стороне сервера для работы кадра MS Entity? - PullRequest
0 голосов
/ 26 августа 2009

Предположим, у меня есть пара столов:

person(personid, name, email)
employee(personid,cardno, departmentID)   //personid,departmentID is foreign key
department(departmentID, departmentName)
employeePhone(personID, phoneID)   //this is relationship table
phone(phoneID, phonenumer) 

Когда EntityFramework генерирует класс сущности для сотрудника, этот класс имеет следующие члены:

public partial class employee{
  int _personid;
  string _cardno;
  string _departmentName;
  person _person;
  department _department;  
  //......
}

по умолчанию, когда этот класс загружен, загружаются только данные, доступные для столбца таблицы сотрудников, а не данные для связанных объектов. Если я использую Linq для получения данных на стороне клиента, для запроса linq следует использовать Include.

У меня такой вопрос: я хочу, чтобы данные связанных сущностей загружались на стороне сервера, когда сотрудник создается на стороне сервера. Поэтому, когда я получаю объект на стороне клиента, все данные уже доступны, так что я могу легко связать его с пользовательским интерфейсом.

Как реализовать этот запрос?

Ответы [ 2 ]

1 голос
/ 26 августа 2009

Не привязывайте типы сущностей к вашему интерфейсу. Это связывает пользовательский интерфейс с уровнем сущности. Загрузка будет наименьшей из ваших проблем. При использовании связанного пользовательского интерфейса вы нарушаете принцип единой ответственности, требует, чтобы черные списки / белые списки поддерживались в любой форме безопасности, типы разрывов, которые не могут работать с циклическими ссылками, у вас низкая производительность, поскольку вы загружаете все поля из всех связанных типов и т. д. и т. п.

Вместо этого создайте выделенную модель вида и спроецируйте на нее:

var pm = (from e in Context.Employees
          where e.Id == id
          select new EmployeePresentation
          {
              EmployeeNumber = e.Number,
              Name = e.Person.Name,
              // etc.
          }.First();

Поскольку это LINQ to Entities, поля, на которые вы ссылаетесь в Person и т. Д., Загружаются автоматически, не требуя активной загрузки, отложенной загрузки или явной загрузки (). Но только эти поля, а не вся Персона , как с любым другим методом.

Обновление, по комментариям Использование моделей презентации также важно для обновления. Это не тот случай, когда я хочу, чтобы пользователь мог обновлять каждое поле, которое он может видеть. Различные модели представления для одной и той же сущности могут иметь разные правила проверки / создания леса, поскольку они используются в разных точках потока данных в приложении. Кроме того, пользователь должен неявно обновлять поля, которые он не может видеть (например, отметка времени).

Обычно мои обновления выглядят так (веб-приложение ASP.MVC):

public ActionResult Update(EmployeePresentation model)
{
    if (!ModelState.IsValid)
    {
        // User violated validation rule on presentation model.
        return View(model);
    }
    Repository.Update(model.Id, delegate(Employee employee) 
    {
        model.UpdateEmployee(employee);
    });
    return RedirectToAction("Index");
}

Обратите внимание, что пользователь никогда не сможет обновить что-либо, что ему не разрешено, проверенным типом, безопасным для типов способом, и что привязка модели, модель презентации и хранилище могут быть расширены для настраиваемого поведения. .

0 голосов
/ 26 августа 2009

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

См. «Настройка отложенной загрузки в Entity Framework» в этой статье: Entity Framework и отложенная загрузка

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...