4

私はここ数か月、 ADO.Net Data Services(Astoria)を使用して学習してきましたが、このテクノロジは気に入っていますが、学習は実際の試行でした。それらを効果的に使用するために必要な情報は、MSDNドキュメント、記事、ブログ投稿、サポートフォーラム、そしてもちろんStackOverflowに広がっています。この質問は、他の誰かが利益を得ることができるように、私の苦労して得た発見のいくつかを共有するための場所です。また、他の人がベストプラクティスやFAQを提供し、私の誤解を正してくれることを願っています。

完全に開示するために、私は自分の生活をより複雑にするためにLinq to SQLでフレームワークを使用してきました。したがって、私の回答の詳細がEntityFrameworkにも適切であることを願っています。

以下から始めるために、私が不可欠だと思ったいくつかのリンクがあります。次に、回答セクションにトピック固有のビットを配置します。

便利なリンク

4

3 に答える 3

2

サービス運営

データをクエリして単純な更新や作成を実行できるだけでは不十分な場合があります。URI スキームでは不可能なビジネス ロジックや複雑なクエリの作成を実装したい場合があります。Data Services は、サービス操作を使用して非常に基本的な形式でこれをサポートします。

これらを使用すると、サービスにメソッドを追加できますが、いくつかの制限があります。

  1. 基本型またはエンティティ型 (つまり、サービスによって既に公開されている型) のみを使用できます。
  2. メソッド パラメーターは、URL の一部として表現できる単純な型のみにすることができます。
  3. datasvcutil によってサービス操作用のコードが生成されないため、自分でクライアント ライブラリに追加する必要があります。
  4. エンティティ タイプを返しても返すものが何もない場合、つまり結果が null の場合、HTTP 応答として 404 が返されます。
  5. void を返すと、クライアント データ コンテキストを使用して要求を行うことができなくなります。WebRequest を使用する必要があります。

例 (わかりました、これらは単純化されているため、実際にはサービス オペレーションである必要はありません):

[WebGet]
public Product GetProductByID(int productID)
{
    return this.CurrentDataSource.Products.First(p => p.ID == productID);
}

[WebGet]
public IEnumerable<Product> GetCancelledProducts(int productID)
{
    return this.CurrentDataSource.Products.Where(p.Cancelled);
}
于 2009-10-06T17:05:35.123 に答える
1

LinqtoSQLの操作

箱から出してすぐに、LinqtoSQLをDataServicesの読み取り専用データコンテキストとして使用できます。

public class MyService : DataService<MyLinqToSqlDataContext>

ただし、更新/書き込みのサポートを受けるには、LinqtoSQLのIUpdateableを実装する必要があります。幸い、AndrewConradがMSDNコードギャラリーに1つ掲載しています。

ADO.Net Data Services ILinqtoSqlの更新可能な実装

これをデータコンテキストの部分クラスとしてドロップすると、書き込みと読み取りの両方の準備が整います。この実装にはサイトで詳細に説明されているいくつかの小さな問題があり、設計どおりにEntityFrameworkでDataServicesを使用すると少しシームレスに感じる場合があることに注意してください。

更新チェック

変更を保存すると、Linq to Sqlがフィールドの既存の値をチェックするWHERE句を生成することがわかりますが、これは必ずしも必要な値とは限りません。これは、データサービス固有ではなく、実際にはLinq to Sqlのヒントですが、LinqtoSqlを使用するのはこれだけです。この動作を停止するには、Linq to Sqlデザイナに移動し、チェックしたくないフィールドを選択します。UpdateCheckプロパティをNeverまたはOnlyWhenChangedに変更します。

于 2009-10-06T16:46:10.157 に答える
1

Silverlightクライアントライブラリ

LINQクエリ

最初は、すべてのクエリが非同期であり、IEnumerableにBeginExecuteメソッドがないため、linq構文をコンテキストから使用できないように見えます。Linq構文を使用するには、最終的なクエリをキャストする必要があります。

var query = (DataServiceQuery<Product>)myContext.Products.Where(p => p.SupplierID == 5);
query.BeginExecute(this.HandleQueryResults, query);

クエリが渡されることに注意してください。これは、EndExecuteを呼び出すために同じDataServiceQueryインスタンスを使用する必要があるためであり、コンテキストだけを使用することはできません。

変更の追跡

クライアントライブラリは、生成されたタイプのフィールドの変更を自動的に追跡しません。これを機能させるには、部分型にINotifyPropertyChangedを実装する必要があります。

例:

public partial class Product : INotifyPropertyChanged {

    public event PropertyChangedEventHandler PropertyChanged;

    partial void OnProductIDChanged() { FirePropertyChanged("ProductID"); }
    partial void OnProductNameChanged() { FirePropertyChanged("ProductName"); }

    private void FirePropertyChanged(string property) { ... }
}

バージョン1.5では、Data Servicesツールでこれを生成できますが、現在はCTPのみです:1.5CTP2を使用するSilverlight3でのデータバインディングの概要

更新されたサーバーデータ

デフォルトでは、SilverlightクライアントコンテキストではMergeOptionがAppendOnlyに設定されています。これが意味するのは、エンティティを初めてクエリした後は、エンティティへの変更は表示されないということです。これは、キャッシュとパフォーマンスの最適化の一形態です。更新を確認するには、MergeOptionをOverwriteChangesに変更する必要があります。これにより、オブジェクトが確実に更新されます。コンテキストを破棄して再作成することもできます。

myContext.MergeOption = MergeOption.OverwriteChanges

クロスドメインアクセス

ADO.NET Data Services 1用にSilverlightで生成された型は、独自のネットワークスタックを使用して、より多くの要求動詞を使用できるようにしますが、残念ながら、これはクロスドメインポリシーが適用されず、クロスドメイン要求を行うことができないことを意味します。これを回避するには、リクエストをプロキシするか、Silverlight 3でクロスドメインをサポートするバージョン1.5(CTP 2が現在利用可能)を待つことができます。

リンク:

于 2009-10-06T16:33:29.277 に答える