微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Linq查询从FakeXrmEasy上下文返回错误记录

如何解决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匹配的实体,但是将返回记录,其中发票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我的查询应该返回零记录,但这每次都会返回第二条记录,即使状态码也是如此。Value== 2?

解决方法

我的问题似乎与如何初始化/设置数据有关。 如果我在调用XrmFakedContext之前使用该值设置了实体,则查询的行为符合预期,但如果在初始化后按如下方式手动更新状态代码,则会发生怪异。

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

非常感谢Jordi在dynamicsvalue上的帮助。

,

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

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

此行为实际上模仿了CDS /组织服务。如果您在代码中设置了实体属性,而没有将其实际保存回CDS / CRM / OrgService,则在检索它时,该属性将不存在,因为它实际上并未在实际数据库中进行更新。

与FakeXrmEasy的概念相同。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。