Question

J'ai une question qui me pose problème dans ADO.NET Data Services:

Lors de l'assemblage d'une entité pour le stockage, je dois obtenir une valeur associée à partir d'un fichier de recherche. Par exemple, une personne a un code d’état «En attente» qui se trouve dans une table appelée StatusCodes.

Dans Entity Framework, je devrais définir la valeur de person.StatusCode égale à une instance du StatusCode. Dans Entity Framework ou dans LINQ2Sql, je voudrais quelque chose comme ceci:

      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 requête pour le statCode ne fonctionnera pas dans ADO.NET Data Services et j'obtiens une erreur d'exécution indiquant que la fonction n'est pas prise en charge. Je suppose que c'est parce que la recherche de statCode n'est pas un appel asynchrone.

Cependant,

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

ne fonctionne pas non plus en raison de la nature asynchrone de la requête, le résultat ne sera pas renvoyé avant que la sauvegarde soit effectuée.

Est-ce que j'approche correctement?

Merci

Était-ce utile?

La solution

Après avoir dormi là-dessus, j’ai proposé ce qui suit:

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

Je peux créer une copie locale du code d'état et la lier au contexte. Il est important de créer appStatPending au lieu de créer un StatusCode.CreateStatusCode () car cela ajoutera un nouveau StatusCode à la base de données lorsque le graphe de personnes persistera. Pour la même raison, il est important de faire AttachTo ("StatusCodeSet", appStatPending), car myContext.AddToStatusCodeSet () ajoutera également une nouvelle entrée à la table StatusCodes de la base de données.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top