2009-03-17 6 views
0

J'ai une question avec laquelle je suis aux prises avec ADO.NET Data Services:Services de données ADO.NET: appels non asynchrones?

Lors de l'assemblage d'une entité pour le stockage, j'ai besoin d'obtenir une valeur liée à partir d'un fichier de recherche. Par exemple, une personne a un code d'état assigné de 'Pending' qui se trouve dans une table appelée StatusCodes.

Dans Entity Framework, il faudrait que la valeur de person.StatusCode soit égale à une instance de StatusCode. Dans le cadre d'entité ou linq2sql je voudrais donc quelque chose comme ceci:

 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); 

La requête pour la STATCODE ne fonctionnera pas dans ADO.NET Data Services et je reçois une erreur d'exécution dire la fonction est pas prise en charge. Je suppose que c'est parce que la recherche statCode n'est pas un appel Async.

Cependant,

 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); 

ne fonctionne pas non plus en raison de la nature Async de la requête, le résultat ne sera pas de retour avant que la personne arrive, sauf.

Est-ce que je m'approche de cela correctement?

Merci

Répondre

0

Après avoir dormi sur ce que je suis venu avec ce qui suit:

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); 

Je peux créer une copie locale du code d'état et un lien dans le contexte. Il est important de réécrire l'appStatPending plutôt que de faire un StatusCode.CreateStatusCode() car cela ajoutera un nouveau StatusCode à la base de données lorsque le graphe persistera. Pour la même raison, il est important de faire le lien AttachTo ("StatusCodeSet", appStatPending) car myContext.AddToStatusCodeSet() ajoutera également une nouvelle entrée à la table StatusCodes dans la base de données.

Questions connexes