Servizi dati ADO.NET: chiamate non asincrone?
-
19-08-2019 - |
Domanda
Ho una domanda con cui sto lottando in ADO.NET Data Services:
Quando si assembla un'entità per la memorizzazione, è necessario ottenere un valore correlato da un file di ricerca. Ad esempio, a una persona è assegnato un codice di stato "In sospeso" che si trova in una tabella denominata StatusCodes.
In Entity Framework, dovrei impostare il valore di person.StatusCode uguale a un'istanza di StatusCode. Nel Entity Framework o in LINQ2Sql farei qualcosa del genere:
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 query per statCode non funzionerà in ADO.NET Data Services e viene visualizzato un errore di runtime che indica che la funzione non è supportata. Suppongo sia perché la ricerca statCode non è una chiamata asincrona.
Tuttavia,
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);
non funziona neanche a causa della natura asincrona della query, il risultato non tornerà prima che avvenga il salvataggio della persona.
Mi sto avvicinando a questo correttamente?
Grazie
Soluzione
Dopo aver dormito su questo ho pensato a quanto segue:
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);
Posso creare una copia locale del codice di stato e collegarlo al contesto. È importante rinnovare l'appStatPending piuttosto che eseguire StatusCode.CreateStatusCode () poiché in tal modo si aggiungerà un nuovo StatusCode al database quando il grafico persona persiste. Per lo stesso motivo è importante fare AttachTo (" StatusCodeSet " ;, appStatPending) poiché facendo myContext.AddToStatusCodeSet () aggiungerà anche una nuova voce alla tabella StatusCodes nel database.