Свойство навигации теряется? - PullRequest
3 голосов
/ 06 декабря 2011

Я занимаюсь разработкой приложения с использованием WPF / MVVM.У меня есть проект службы данных WCF, который предоставляет операции для извлечения данных из модели данных ADO.NET с использованием структуры сущностей.Затем у меня есть клиент wpf, который связывается со свойствами viewmodel, которые выбираются из службы WCF.Сценарий вовлекает клиентов / офисы.Клиентская сущность имеет свойство навигации типа office, которое реализовано в виде внешнего ключа в базе данных.Проблема в том, что когда моя viewmodel получает список клиентов из службы данных, свойство навигации имеет значение null.Операция службы, однако, получает эту информацию.

Операция службы WCF

[OperationContract]
public IEnumerable<Client> GetClientsByOffice(int officeID)
{
    using (var context = new LDC_Entities())
    {
        var result = context.Clients.Include("Registered_Office")
            .Where(c => c.Registered_Office_ID == officeID).ToList();

        result.ForEach(c => context.Detach(c));
        return result;
    }
}

Как видно, свойство office загружается в контекстном запросе.Если в этот момент я установлю точку останова, переменная результата содержит информацию о клиентах, а свойство навигации также будет заполнено, как и ожидалось.

WPF ViewModel

private void RefreshClients()
{
    serviceClient.GetClientsByOfficeCompleted += (s, e) =>
    {
            Clients = e.Result;
            foreach (Client c in Clients)
                MessageBox.Show(c.Office.City);
    };

    this.serviceClient.GetClientsByOfficeAsync(CurrentOffice.Office_ID);
}

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

Может кто-нибудь объяснить, как можно сохранить эту информацию при выполнении этого вызова?

Большое спасибозаранее, Майк

1 Ответ

1 голос
/ 06 декабря 2011

Как видите, свойство office загружается в контекстном запросе.Если в этот момент я установлю точку останова, переменная результата содержит информацию о клиентах, а свойство навигации также будет заполнено, как и ожидалось.

Я не уверен, о какой точке вы говорите,так как там есть несколько строк кода.Но граф объектов уничтожается, когда вы отсоединяете сущности .

. Решение, представленное в этом вопросе, заключается в использовании запроса NoTracking, поэтому вам не нужно отсоединять:

using (var context = new LDC_Entities())
{
    context.Job.MergeOption = MergeOption.NoTracking;
    return context.Clients.Include("Registered_Office")
        .Where(c => c.Registered_Office_ID == officeID)
        .ToList();
}

Это решение, вероятно, будет работать лучше для вас, чем в этом вопросе, потому что им также нужно было выполнить обновление, которое требует отслеживания объекта, тогда как вы просто делаете запрос.

Другой способЧтобы решить эту проблему, нужно избегать выставления классов из вашего уровня персистентности данных слоям более высокого уровня.Тогда вам не нужно беспокоиться о таких вещах, как то, как объекты сериализуются, поскольку вы работаете с ними только при работе непосредственно со слоем персистентности данных.Это также дает другие преимущества, такие как более слабая связь между слоями и предоставление менее ненужных данных слоям более высокого уровня.Использование такой библиотеки, как AutoMapper , может помочь сократить объемы копирования данных между слоями.

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