ADO.NET Службы передачи данных:Несинхронизирующие вызовы?
-
19-08-2019 - |
Вопрос
У меня есть вопрос, с которым я борюсь в разделе ADO.NET Службы передачи данных:
При сборке объекта для хранения мне нужно получить связанное значение из файла подстановки.Например, пользователю присвоен код статуса "Ожидающий", который находится в таблице под названием 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 Службы передачи данных, и я получаю сообщение об ошибке во время выполнения, в котором говорится, что функция не поддерживается.Я предполагаю, что это потому, что поиск 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);
также не работает из-за асинхронного характера запроса, результат не будет возвращен до того, как произойдет сохранение пользователя.
Правильно ли я подхожу к этому?
Спасибо
Решение
Поспав над этим, я пришел к следующему:
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 в базу данных, когда сохранится график person.По той же причине важно выполнить AttachTo("StatusCodeSet", appStatPending) после выполнения MyContext .AddToStatusCodeSet() также добавит новую запись в таблицу StatusCodes в базе данных.