Запрос Linq возвращает ошибочную запись из контекста FakeXrmEasy
Я новичок в мире FakeXrmEasy и пытаюсь реализовать некоторые модульные тесты в большой существующей базе кода, написанной другой командой:)
У меня есть набор сущностей в приложении OnPremise DynamicsCRM, в котором сущность имеет следующие свойства:
[Microsoft.Xrm.Sdk.AttributeLogicalNameAttribute("statuscode")]
public Microsoft.Xrm.Sdk.OptionSetValue statuscode
{
get
{
return this.GetAttributeValue<Microsoft.Xrm.Sdk.OptionSetValue>("statuscode");
}
set
{
this.OnPropertyChanging("statuscode");
this.SetAttributeValue("statuscode", value);
this.OnPropertyChanged("statuscode");
}
}
/// <summary>
/// Invoice
/// </summary>
[Microsoft.Xrm.Sdk.AttributeLogicalNameAttribute("invoiceid")]
public Microsoft.Xrm.Sdk.EntityReference InvoiceId
{
get
{
return this.GetAttributeValue<Microsoft.Xrm.Sdk.EntityReference>("invoiceid");
}
set
{
this.OnPropertyChanging("InvoiceId");
this.SetAttributeValue("invoiceid", value);
this.OnPropertyChanged("InvoiceId");
}
}
Итак, мой InvoiceId - это EntityReference, а мое свойство statuscode - это тип OptionSetValue. У меня есть запрос, чтобы вернуть мне объекты, которые соответствуют InvoiceId && statuscode!= X, но возвращается запись там, где совпадает идентификатор счета-фактуры, но также, если statuscode.Value == X, поэтому применяется только первая часть where или вторая часть не выполняется но результат все же добавлен.
Мой запрос:
var result = (from qa in ctx.allocationSet
where qa.InvoiceId.Id == invoiceId
&& qa.statuscode.Value != 2
select qa);
Итак, по сути, если я заполняю 2 записи в этом наборе, 1 с InvoiceId abc-123 и statuscode = 1, затем другой с InvoiceId XYZ-987 с statuscode = 2, а затем поиск invoiceId XYZ-987, мой запрос должен возвращать ноль записей, но это каждый раз возвращает вторую запись, даже если statuscode.Value ==2?
2 ответа
Запрос в FakeXrmEasy вернет результаты на основе текущего состояния базы данных в памяти.
Если вы внесете изменение в запись объекта, не сохраняя его в базе данных в памяти (то есть без фактического вызова таких методов, как service.Create, service.Update, service.Delete и т. Д.), То эти изменения победят. t будет сохраняться в базе данных, поэтому изменения не будут отражены при извлечении данных из нее.
Это поведение фактически имитирует CDS / службу организации. Если вы установите атрибут объекта в коде, не сохраняя его обратно в CDS / CRM / OrgService, то при его извлечении его там не будет, потому что он фактически не обновлялся в реальной базе данных.
То же самое и с FakeXrmEasy.
Моя проблема, похоже, связана с тем, как данные инициализируются / устанавливаются. Если я настроил объект со значением перед вызовом XrmFakedContext, тогда запрос будет вести себя так, как ожидалось, но если после инициализации я обновляю код состояния вручную, как показано ниже, происходит странность.
var allocation = ctx.allocationSet.First(x => x.InvoiceId.Id == _testInvoiceId);
allocation.Attributes["statuscode"] = new OptionSetValue((int)allocation.statuscodeValues.Active);
Большое спасибо Джорди в Dynamics Valve за помощь.