Ошибка типа FirstOrDefault () при возврате? - PullRequest
0 голосов
/ 25 августа 2009

Служба RIA Domain имеет этот метод ...

public virtual CmsDealer GetCmsDealer(string id)
{
    return this.Context.CmsDealerSet.FirstOrDefault(p => p.Id == id);
}

Сервис Wcf имеет это ...

public CmsDealer GetDealer(string id)
{
    return domainservice.GetCmsDealer(id);
}

При вызове с несуществующим идентификатором, GetCmsDealer () вызывает barfs с исключением около

Невозможно привести объект типа 'System.Object []' к типу 'RIAServicesLibrary.Web.Models.CmsDealer []'.

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

Любое понимание полезно, я немного озадачен и немного новичок об EF, RIA и Wcf.

Обновлено: Проблема в том, что мне нужно отследить сбой на всем пути до Wcf, чтобы приложение, которое в конечном итоге вызывает GetDealer, могло обнаружить, что решения не было. В идеале мне нужно сделать это, не оставляя необъяснимых исключений вокруг:)

Решение try / catch внутри GetCmsDealer позволит мне обнаружить сбой, но до сих пор нет способа перезапустить «пустой» объект CmsDealer без фальсификации ряда ограничений (кажется, что сущность требовательна к этому).

Так что я могу попробовать / перехватить и в GetDealer, но у меня все еще нет действительного объекта CmsDealer для возврата.

Спасибо!

ОБНОВЛЕНО

Для тех, кому было интересно, как это закончилось, финальная рутина выглядела так ...

public virtual IQueryable<CmsDealer> GetCmsDealerSetOrEmpty(string id)
{
    return this.Context.CmsDealerSet
        .Include("CmsItemState")
        .Where(p => p.Id == id)
        ;
}

Оболочка Wcf теперь снова стала простым проходом. На клиенте я проверяю Count () результата, если он равен 0, то я могу знать, что записи не было, если это 1, тогда простой First () возвращает мне запись.

Готов поспорить, есть лучший способ.

Ответы [ 3 ]

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

Вы также можете изменить службу домена, чтобы сделать выбор вместо этого, чтобы получить IEnumerable (в котором есть счетчик, если я не ошибаюсь), который вы можете проверить в своей службе WCF. Таким образом, вы бы изменили это так: общедоступный виртуальный IEnumerable GetDealer (идентификатор строки) { вернуть this.Context.CmsDealerSet.Select (p => p.Id == id); }

Тогда в службе WCF вы можете сделать: общедоступный CmsDealer GetDealer (идентификатор строки) { var x = domainservice.GetCmsDealer (id); if (x.Count () == 0) { // упс, здесь нечего видеть } еще { // живи здесь } }

3 голосов
/ 27 августа 2009

Вот хорошая возможность для шаблона нулевого объекта . Для примера рассмотрим Double.NaN как значение по умолчанию.

Изменение функции службы домена следующим образом

public virtual CmsDealer GetCmsDealer(string id)
{
  return this.Context.CmsDealerSet.FirstOrDefault(p => p.Id == id)??
    CmsDealer.NullValue;
}

Позволяет вам иметь действительное значение в службе WCF и выполнять проверку на клиенте

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

FirstOrDefault вернет значение Null, если не найдено подходящих записей. Я подозреваю, что у вашего сервиса есть проблема с нулевым возвратом. Я бы порекомендовал изменить это, чтобы вызвать исключение, если совпадений не найдено, и перехватить исключение на вашем клиенте.

Jim

...