Pergunta

Eu tenho uma pergunta que eu estou lutando com em ADO.NET Data Services:

Ao montar uma Entidade para armazenamento eu preciso para obter um valor relacionado a partir de um arquivo de pesquisa. Por exemplo, uma pessoa tem um código de status atribuído de 'Pendente', que está em uma tabela chamada StatusCodes.

Em Entity Framework, eu preciso definir o valor da person.StatusCode igual a uma instância do StatusCode. No Entity Framework ou em LINQ2SQL eu tinha então algo como isto:

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

A consulta para o statCode não vai funcionar em ADO.NET Data Services e eu recebo um erro de execução dizendo que a função não é suportada. Eu suponho que é porque a pesquisa statCode não é uma chamada assíncrona.

No entanto,

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

não quer trabalhar devido à natureza assíncrona da consulta, o resultado não estará de volta antes que a pessoa save acontece.

Am I aproximando isso corretamente?

Graças

Foi útil?

Solução

Depois de dormir sobre este eu vim com o seguinte:

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

Eu posso criar uma cópia local do código de status e vinculá-lo para o contexto. É importante novo o appStatPending ao invés de fazer um StatusCode.CreateStatusCode () desde que fazendo isso irá adicionar uma nova StatusCode ao banco de dados quando o gráfico pessoa persistiu. Pela mesma razão, é importante para fazer o AttachTo ( "StatusCodeSet", appStatPending) desde fazendo myContext.AddToStatusCodeSet () também irá adicionar uma nova entrada para a mesa de StatusCodes no banco de dados.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top