【问题标题】:Linq query returning erroneous record from FakeXrmEasy contextLinq 查询从 FakeXrmEasy 上下文返回错误记录
【发布时间】:2021-02-04 13:13:24
【问题描述】:

我是 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?

【问题讨论】:

    标签: c# visual-studio linq dynamics-crm fakexrmeasy


    【解决方案1】:

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

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

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

    与 FakeXrmEasy 的概念确实相同。

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-07-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多