我是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的实体,但是返回的记录是在发票id匹配的地方,而且如果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 my 987,statuscode = 2,那么搜索invoiceId my 987我的查询应该返回零条记录,但这将每次返回第二条记录,即使statuscode.Value ==2?
发布于 2020-10-23 16:37:13
FakeXrmEasy中的查询将根据内存中数据库的当前状态返回结果。
如果您在没有真正将实体记录持久化到内存中的数据库(即,没有实际调用service.Create、service.Update、service.Delete等方法)的情况下对实体记录进行了更改,那么这些更改将不会持久化到数据库中,因此,当从数据库中检索数据时,这些更改也不会反映出来。
此行为实际上模仿了CDS /组织服务。如果您在代码中设置了一个实体属性,而没有实际将其保存回CDS / CRM / OrgService,那么当您检索它时,它将不在那里,因为它实际上并没有在实际的数据库中更新。
所以和FakeXrmEasy的概念是一样的。
发布于 2020-10-22 00:06:25
我的问题似乎与数据如何初始化/设置有关。如果我在调用XrmFakedContext之前设置了实体的值,那么查询就会像预期的那样运行,但如果在初始化之后手动更新状态代码,如下所示,就会发生奇怪的事情。
var allocation = ctx.allocationSet.First(x => x.InvoiceId.Id == _testInvoiceId);
allocation.Attributes["statuscode"] = new OptionSetValue((int)allocation.statuscodeValues.Active);非常感谢dynamicsvalue的乔迪的帮助。
https://stackoverflow.com/questions/64466666
复制相似问题