RIA ドメイン サービスには、このメソッドがあります...
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);
}
存在しない ID で呼び出された場合、GetCmsDealer() は barfs を例外として呼び出します。
タイプ「System.Object[]」のオブジェクトをタイプ「RIAServicesLibrary.Web.Models.CmsDealer[]」にキャストできません。
後でテストできるように、単にnullを返すというのが私の印象でした。しかし、どういうわけかそれは起こっていません。私が見つけたすべての例は、このようなものがうまく機能していることを示しています。
どんな洞察も役に立ちます。私は少し困惑しており、EF、RIA、およびWcfについて少し初心者です。
更新:問題は、最終的に GetDealer を呼び出すアプリケーションが解決策がなかったことを検出できるように、Wcf までずっと失敗を追跡する必要があることです。理想的には、キャッチされていない例外を周囲に残さずにそれを行う必要があります:)
GetCmsDealer 内の try/catch ソリューションにより、失敗を検出できますが、多くの制約を偽造することなく「空の」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() でレコードが取得されます。
もっと良い方法があると確信しています。