0

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() でレコードが取得されます。

もっと良い方法があると確信しています。

4

3 に答える 3

3

代わりに選択を行うようにドメイン サービスを変更して、WCF サービスでテストできる IEnumerable (私が間違っていなければカウントがある) を取得することもできます。したがって、これを次のように変更します。 public virtual IEnumerable GetDealer(string id){ return this.Context.CmsDealerSet.Select(p => p.Id == id); }

次に、WCF サービスで次のことができます。 public CmsDealer GetDealer(string id) { var x = domainservice.GetCmsDealer(id); if(x.Count() == 0) { // おっと、ここには何も表示されません } else { // ここにライブがあります } }

于 2009-08-26T19:48:30.283 に答える
3

Null オブジェクト パターンの良い機会です。その例として、Double.NaN をデフォルト値と考えてください。

ドメインサービスの機能を次のように変更します

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

WCF サービスで有効な値を取得し、クライアントでチェックを実行できるようにします

于 2009-08-27T02:37:58.980 に答える
0

一致するレコードが見つからない場合、FirstOrDefaultはNullを返します。あなたのサービスはnullリターンに問題があると思われます。一致するものが見つからない場合に例外をスローし、クライアントで例外をキャッチするようにこれを変更することをお勧めします。

ジム

于 2009-08-26T16:51:48.283 に答える