Свойства нулевой навигации с использованием OData / Entity Framework - PullRequest
1 голос
/ 01 марта 2012

У меня есть схема базы данных (MySql), представленная как служба данных / OData, которая запрашивается моим клиентом Silverlight с помощью Linq. Вот эта модель: enter image description here

Столбцы Level и Application являются значениями Int, ссылающимися через внешний ключ на таблицы lookuplevel и lookuppid соответственно.

Итак, запись в таблице logstest может выглядеть следующим образом:

ID:35
Date: 2012-02-29
Level: 1
Application: 1
Message: MyMessage
Exception: MyException
ReverseOrder: 56 (don't mind this column)

И мы могли бы иметь на уровне поиска :

ID: 1
String: Warning

А в lookuppid

ID: 1
String: Product A

Как вы можете видеть, столбцы Level и Application фактически сопоставлены со значением в указанной там таблице.

Теперь на стороне клиента (Silverlight) я получаю содержимое таблицы logstest через запрос linq.

public void LoadErrors()
{
   var linqQuery = (from e in _myEntities.logstests
                    select e);

   AsyncCallback GetDataComplete = new AsyncCallback(MyCallback);
           ((DataServiceQuery<logstest>)linqQuery).BeginExecute(GetDataComplete, linqQuery);
}

private void MyCallback(IAsyncResult asyncResult)
{
    DataServiceQuery<logstest> query = asyncResult.AsyncState as DataServiceQuery<logstest>;

    foreach (logstest error in e.Query.EndExecute(e.Result))
    {
        Error newError = new Error
        {
            Date = error.Date,
            Level = error.lookuplevel.String,
            Application = error.lookuppid.String,
            Message = error.Message,
            Exception = error.Exception
        };
    }

    // Do more stuff...
}

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

Очевидно, что для столбцов Уровень и Приложение я не хочу отображать индекс значения, на которое они ссылаются, но само значение (т. Е. Для уровня Я хочу отобразить Предупреждение, а не 1).

Проблема в том, что оба значения error.lookuplevel и error.lookuppid равны нулю, и я понятия не имею, почему. Есть ли где-нибудь гоча, о которой я не знаю?

Заранее спасибо!

Ответы [ 3 ]

2 голосов
/ 01 марта 2012

Вы должны явно попросить включить связанный объект, иначе Клиент WCF DS не будет запрашивать его на сервере. Кроме того, он не выполняет отложенную загрузку свойств навигации, поскольку отложенная загрузка должна будет вызывать HTTP-запрос, который может занять очень много времени, и поэтому не рекомендуется делать это внутри метода получения свойства.

Чтобы попросить включить связанные сущности, вам нужно добавить в запрос $ expand, например:

var linqQuery = (from e in 
   _myEntities.logstests.Expand("lookuppid").Expand("lookuplevel")  
   select e); 
0 голосов
/ 01 марта 2012

Пожалуйста, установите EF 4.1 из http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=8363, чтобы прекратить использование волшебных строк внутри Include. Добавить

using System.Data.Entity;

к вашим заявлениям об использовании.

Затем напишите следующий запрос:

var linqQuery = _myEntities.logstests.Include(e=>e.lookuppid).Include(e=>e.lookuplevel);

Для получения дополнительной информации см. http://blogs.msdn.com/b/adonet/archive/2011/01/31/using-dbcontext-in-ef-feature-ctp5-part-6-loading-related-entities.aspx

0 голосов
/ 01 марта 2012

Обычно в EF, если у вас не включена отложенная загрузка в контексте, вам нужно включить в запрос свойство навигации по имени:

var linqQuery = (from e in
   _myEntities.logstests.Include("lookuppid").Include("lookuplevel") 
   select e);
...