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

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top