Службы данных ADO.NET: не асинхронные вызовы? - PullRequest
0 голосов
/ 17 марта 2009

У меня есть вопрос, с которым я сталкиваюсь в ADO.NET Data Services:

При сборке сущности для хранения мне нужно получить связанное значение из файла поиска. Например, человеку назначен код состояния «Ожидание», который находится в таблице с именем StatusCodes.

В Entity Framework мне нужно было бы установить значение person.StatusCode равным экземпляру StatusCode. В Entity Framework или в LINQ2Sql я бы так что-то вроде этого:

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

Запрос для statCode не будет работать в ADO.NET Data Services, и я получаю сообщение об ошибке во время выполнения, в котором говорится, что функция не поддерживается. Я предполагаю, что это потому, что поиск statCode не является асинхронным вызовом.

Однако

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

тоже не работает из-за асинхронной природы запроса, результат не вернется, пока не произойдет сохранение.

Правильно ли я подхожу к этому?

Спасибо

1 Ответ

0 голосов
/ 18 марта 2009

После сна я придумал следующее:

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

Я могу создать локальную копию кода состояния и связать его с контекстом. Важно создать новый appStatPending, а не делать StatusCode.CreateStatusCode (), так как это добавит новый StatusCode в базу данных, когда граф персоны сохранится. По той же причине важно выполнить AttachTo («StatusCodeSet», appStatPending), поскольку выполнение myContext.AddToStatusCodeSet () также добавит новую запись в таблицу StatusCodes в базе данных.

...