2009-03-17 27 views
0

私はADO.NET Data Servicesで苦労している質問があります。ADO.NETデータサービス:非同期呼び出し?

エンティティをストレージ用に組み立てる場合、ルックアップファイルから関連する値を取得する必要があります。たとえば、ある人物がStatusCodesというテーブルにある「ペンディング」というステータスコードを割り当てられているとします。

Entity Frameworkでは、person.StatusCodeの値をStatusCodeのインスタンスと同じに設定する必要があります。 Entity Frameworkの中やLINQ2Sqlに私はこのようなものだろう:

 var person = Person.CreatePerson(stuff); 

    var statCode = myContext.StatusCodeSet.Where(sc => sc.Description == "Pending").FirstOrDefault(); 

    person.StatusCode = statCode; 

    // ...more code here... 

    myContext.BeginSaveChanges(SaveChangesOptions.Batch, 

           new AsyncCallback(OnSaveAllComplete), 

           null); 

statCodeのクエリは、ADO.NET Data Servicesのでは動作しませんし、私は機能がサポートされていないと言って、ランタイムエラーが発生します。私はstatCodeルックアップが非同期呼び出しではないためだと思います。

しかし、

 var person = Person.CreatePerson(stuff); 
    var query = from stat in myContext.StatusCodeSet 
       where stat.Description == "Pending" 
       select stat; 
    var dsQuery = (DataServiceQuery<StatusCode>)query; 
    dsQuery.BeginExecute(
     result => tutorApplication.StatusCode = dsQuery.EndExecute(result).FirstOrDefault(), null); 
    // ...more code here... 
    myContext.BeginSaveChanges(SaveChangesOptions.Batch, 
          new AsyncCallback(OnSaveAllComplete), 
          null); 

は、クエリの非同期な性質のためにどちらかを動作しませんセーブで人が発生する前に、結果が戻っていないだろう。

私はこれに正しく近づいていますか?

おかげ

答えて

0

は、この上で寝た後、私は次のを思い付いた:

var person = Person.CreatePerson(stuff); 
    var appStatPending = new StatusCode() 
    { 
    StatusCodeId = (int)StatusCodes.Pending, 
    Code = "Pending", 
    Description = "Pending", 
    EffectiveDate = DateTime.Now, 
    EnteredBy = "", 
    EnteredDate = DateTime.Now 
    }; 

    myContext.AttachTo("StatusCodeSet", appStatPending); 
    person.StatusCode = appStatPending; 
    myContext.SetLink(tutorApplication, "StatusCode", appStatPending); 


    // ...more code here... 
    myContext.BeginSaveChanges(SaveChangesOptions.Batch, 
    new AsyncCallback(OnSaveAllComplete), 
    null); 

私は、ステータスコードのローカルコピーを作成し、コンテキストにリンクすることができます。 StatusCode.CreateStatusCode()を実行するよりappStatPendingを新しくすることが重要です。これを行うと、personグラフが永続したときに新しいStatusCodeがデータベースに追加されるためです。同じ理由から、myContext.AddToStatusCodeSet()を実行すると、データベース内のStatusCodesテーブルに新しいエントリも追加されるため、AttachTo( "StatusCodeSet"、appStatPending)を実行することが重要です。

関連する問題