2

私は、プロジェクトを形成するために拡張されたホットタオルテンプレートに付属の Breeze v1.1.2 を使用していました。NuGet パッケージを最新の 1.3.3 に更新するというミスを犯しました (学習したことはありません)。とにかく、すべてが順調で、今はそれほどでもありません!

リリース ノートやその他のドキュメントの指示に従って、BreezeWebApiConfig ファイルを次のように変更しました。

[assembly: WebActivator.PreApplicationStartMethod(
typeof(BreezeWebApiConfig), "RegisterBreezePreStart")]
namespace MyApp.App_Start {
public static class BreezeWebApiConfig {
    public static void RegisterBreezePreStart() {
      GlobalConfiguration.Configuration.Routes.MapHttpRoute(
          name: "BreezeApi",
          routeTemplate: "breeze/{controller}/{action}"
      );}}}

そして、config.js ファイル (EntityManager コンストラクターに serviceName を提供する) を次のようにします。

var remoteServiceName = 'breeze/breeze';  // NEW version
//var remoteServiceName = 'api/breeze';  // OLD version

興味があれば、私の BreezeController:

[BreezeController]
public class BreezeController : ApiController
{
    readonly EFContextProvider<MyDbContext> _contextProvider =
        new EFContextProvider<MyDbContext>();

    [HttpGet]
    public string Metadata()
    {
        return _contextProvider.Metadata();
    }

    [HttpGet]
    public IQueryable<SomeItem> SomeItems()
    {
        // Do stuff here...
    }
}

「metadataStore が設定されるまで _executeQueryCore を実行できません」というエラーが表示されるようになりました。

ここで何が欠けていますか?

編集: 必要な部分を省略した可能性があります... 上記の SomeItems() メソッドで、実際に行われるのは MyDBContext クラスの GetMeSomeData() メソッドの呼び出しです。このメソッドは、ストアド プロシージャに対して次の呼び出しを行い、データを取得します。

public virtual ObjectResult<SomeItem> GetMeSomeData(string inParam)
    {
        var p = new object[] { new SqlParameter("@inParam", inParam) };
        var retVal = ((IObjectContextAdapter)this).ObjectContext.ExecuteStoreQuery<SomeItem>("exec GetData @SN", p);
        return retVal;
    }

私の限られた理解では、 Metadata() への呼び出しは失敗していませんが、戻ってきたときにエンティティモデルが何であるかはわかりませんが、どこかでエンティティからそれを理解する必要があります私が持っているモデル (つまり、SomeItem)? Metadata() からの戻り文字列には、エンティティに関する情報が含まれていません。意識させる方法はありますか?それとも、ヒナギクで遊んでいるレフトフィールドで完全にオフになっていますか?

4

1 に答える 1

1

このレポートに基づいて言うのは難しいです。Breeze が正しいかどうか見てみましょう。

ブラウザーのデバッグ ツールを開き、ネットワーク トラフィックを調べます。そのエラーが発生する前に、サーバーからメタデータを取得しようとしていることがわかりますか? もしそうなら、それは成功しましたか?それとも404?それとも500?エラーは何ですか?

試してもいないに違いない。そうでない場合、通常の理由は、最初のクエリの前に Breeze 操作を試行したことであり、メタデータも明示的に要求していません。エンティティを作成しようとしましたか? それにはメタデータが必要です。

ポイントは、エラーを引き起こした Breeze 操作を追跡する必要があるということです。確かにすべてがうまくいくはずです。世界は虹とユニコーンであるべきです。そうでない場合は、ため息をつき、デバッガーを中断し、エラーから得られた情報から始めます。

それ以外の方は、Breeze の新しいバージョンにアップグレードすることをお勧めします。

みなさん、ハッピーコーディング。

アップデートのフォローアップ

Breeze は、バックエンドでデータを取得する方法を知りません。クエリ結果に認識可能なエンティティが含まれている場合、Breeze はそれをキャッシュします。呼び出し元に提供するものが意味のあるものであることを確認するのは、クエリ コールバックでのあなた次第です。

あなたはサーバー側のメタデータ メソッドであると言っていますが、何が何でSomeItemあるかわかりませんか? それでは、クライアントにはあまり役に立ちません。null 文字列が返された場合、Breeze はそれを「メタデータがまったくない」と見なす場合があります。この場合、「metadataStore が設定されるまで _executeQueryCore を実行できません」というエラー メッセージが表示されます。ところで、ネットワーク トラフィックをチェックして、サーバーがメタデータ リクエストに応答して実際に何を返したか (またはそのようなリクエストがあったかどうか) を判断しましたか?

サーバー上にメタデータを作成するには、さまざまな方法があります。最も簡単な方法は、EF を使用することです。少なくとも、設計時のモデリング ツールとして使用します。あなたのそれMyDbContextには何がありますか?なんで入ってないSomeItemの?

サーバーからメタデータを生成したくない場合は、クライアントでメタデータを作成することもできます。その選択をしたことを Breeze クライアントに伝える必要があります。これの多くは、ドキュメント「メタデータ形式」で説明されています。

私はあなたがそれを翼を張っているように感じます。あなたは幸せな道から外れたいと思っています...そしてそれはクールです. しかし、私たちのほとんどは、走る前に歩くことを学ぶ必要があります.

于 2013-05-17T23:48:43.983 に答える