0

我是 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 XYZ-987 和 statuscode = 2,然后搜索 invoiceId XYZ-987 我的查询应该返回零记录但是这个每次返回第二条记录,即使 statuscode.Value ==2?

4

2 回答 2

1

FakeXrmEasy 中的查询将根据内存数据库的当前状态返回结果。

如果您对实体记录进行更改而没有将其实际持久化到内存数据库中(即,没有实际调用 service.Create、service.Update、service.Delete 等方法),那么这些更改将不会t 被持久化到数据库中,因此,从数据库中检索数据时不会反映更改。

这种行为实际上模仿了 CDS / 组织服务。如果您在代码中设置实体属性,而没有实际将其保存回 CDS / CRM / OrgService,那么当您检索它时,它就不会存在,因为它实际上并没有在真实数据库中更新。

所以与 FakeXrmEasy 的概念相同。

于 2020-10-23T08:37:12.827 回答
0

我的问题似乎与数据的初始化/设置方式有关。如果我在调用 XrmFakedContext 之前使用该值设置实体,则查询的行为与预期相同,但如果在初始化后我手动更新状态码,如下所示,就会发生奇怪的事情。

var allocation = ctx.allocationSet.First(x => x.InvoiceId.Id == _testInvoiceId);
            allocation.Attributes["statuscode"] = new OptionSetValue((int)allocation.statuscodeValues.Active);

非常感谢 dynamicsvalue 的 Jordi 提供的帮助。

于 2020-10-21T16:06:25.050 回答