Servicios de datos ADO.NET: ¿llamadas no asíncronas?
-
19-08-2019 - |
Pregunta
Tengo una pregunta con la que estoy luchando en ADO.NET Data Services:
Al ensamblar una Entidad para almacenamiento, necesito obtener un valor relacionado de un archivo de búsqueda. Por ejemplo, una persona tiene un código de estado asignado de 'Pendiente' que se encuentra en una tabla llamada StatusCodes.
En Entity Framework, necesitaría establecer el valor de person.StatusCode igual a una instancia de StatusCode. En Entity Framework o en LINQ2Sql, me gustaría algo como esto:
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 consulta para statCode no funcionará en ADO.NET Data Services y recibo un error de tiempo de ejecución que dice que la función no es compatible. Supongo que es porque la búsqueda de statCode no es una llamada asíncrona.
Sin embargo,
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);
tampoco funciona debido a la naturaleza asíncrona de la consulta, el resultado no volverá antes de que ocurra el guardado de la persona.
¿Me estoy acercando a esto correctamente?
Gracias
Solución
Después de dormir sobre esto, se me ocurrió lo siguiente:
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);
Puedo crear una copia local del código de estado y vincularlo al contexto. Es importante actualizar el appStatPending en lugar de hacer un StatusCode.CreateStatusCode () ya que al hacerlo se agregará un nuevo StatusCode a la base de datos cuando el gráfico de persona persista. Por la misma razón, es importante hacer AttachTo (" StatusCodeSet " ;, appStatPending) ya que hacer myContext.AddToStatusCodeSet () también agregará una nueva entrada a la tabla StatusCodes en la base de datos.