首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Linq查询从FakeXrmEasy上下文返回错误记录

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

Stack Overflow用户
提问于 2020-10-21 23:15:09
回答 2查看 122关注 0票数 0

我是FakeXrmEasy世界的新手,正在尝试在另一个团队编写的大型现有代码库中实现一些单元测试:)

我在OnPremise DynamicsCRM应用程序中设置了一个实体,该实体具有以下属性:

代码语言:javascript
复制
[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的第一部分,或者第二部分失败了,但仍然添加了结果。

我的问题是:

代码语言:javascript
复制
    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?

EN

回答 2

Stack Overflow用户

发布于 2020-10-23 16:37:13

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

如果您在没有真正将实体记录持久化到内存中的数据库(即,没有实际调用service.Create、service.Update、service.Delete等方法)的情况下对实体记录进行了更改,那么这些更改将不会持久化到数据库中,因此,当从数据库中检索数据时,这些更改也不会反映出来。

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

所以和FakeXrmEasy的概念是一样的。

票数 1
EN

Stack Overflow用户

发布于 2020-10-22 00:06:25

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

代码语言:javascript
复制
var allocation = ctx.allocationSet.First(x => x.InvoiceId.Id == _testInvoiceId);
            allocation.Attributes["statuscode"] = new OptionSetValue((int)allocation.statuscodeValues.Active);

非常感谢dynamicsvalue的乔迪的帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64466666

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档