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

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top