首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Delphi - mORMot不能通过使用全内存模型和TSQLRestClientURI的客户端访问数据

Delphi - mORMot不能通过使用全内存模型和TSQLRestClientURI的客户端访问数据
EN

Stack Overflow用户
提问于 2019-07-31 15:24:27
回答 1查看 237关注 0票数 1

我一直在尝试使用mORMOt启动一个新项目,创建了几个类,并开始以一种简单的方式测试其中的一个。我使用了您的DDD-sample中关于TUser的回归测试代码,并对其进行了修改以适合我的类。

我已经尝试最小化代码,希望它能包含一些线索来帮助我理解这里的错误。我发现,当只使用服务器时,一切正常,但当使用客户端时,ORMselection找不到数据。我尽可能地精简了代码,并在它工作的地方和不工作的地方做了一些注释。

代码语言:javascript
复制
class procedure TInfraRepoPackageFactory.RegressionTestsPackage(test: TSynTestCase);
procedure TestOne(Rest: TSQLRest);
var cmd: IDomPackageCommand;
    qry: IDomPackageQuery;
    package: TPackage;
begin
  test.Check(Rest.Services.Resolve(IDomPackageCommand,cmd));
  package := TPackage.Create;
  try
      package.articleNo := 10000;
      test.check(cmd.Add(package)=cqrsSuccess);
    end;
    test.check(cmd.Commit=cqrsSuccess);
  finally
    package.Free;
  end;
  package := TPackage.Create;
  try
    test.Check(Rest.Services.Resolve(IDompackageQuery,qry));
      test.Check(qry.SelectByArticleNo(10000,false)=cqrsSuccess);  // <<-- Debugging shows that it will not find anything when using client.
      test.Check(qry.GetCount=1);                                             // <<-- getCount returns zero when using client.
    end;
  finally
    package.Free;
  end;

end;

var RestServer: TSQLRestServerFullMemory;
    RestClient: TSQLRestClientURI;
begin
  RestServer := TSQLRestServerFullMemory.CreateWithOwnModel([TSQLRecordPackage]);
  try // first try directly on server side
    RestServer.ServiceContainer.InjectResolver([TInfraRepoPackageFactory.Create(RestServer)],true);
    TestOne(RestServer); // sub function will ensure that all I*Command are released    // <<=== Works
  finally
    RestServer.Free;
  end;
  RestServer := TSQLRestServerFullMemory.CreateWithOwnModel([TSQLRecordPackage]);
  try // then try from a client-server process
    RestServer.ServiceContainer.InjectResolver([TInfraRepoPackageFactory.Create(RestServer)],true);
    RestServer.ServiceDefine(TInfraRepoPackage,[IDomPackageCommand,IDomPackageQuery],sicClientDriven);
    test.Check(RestServer.ExportServer);
    RestClient := TSQLRestClientURIDll.Create(TSQLModel.Create([TSQLRecordPackage]),@URIRequest);
    try
      RestClient.Model.Owner := RestClient;
      RestClient.ServiceDefine([IDomPackageCommand],sicClientDriven);
      TestOne(RestServer);                                                             // <<=== Works
      RestServer.DropDatabase;
      USEFASTMM4ALLOC := true; // for slightly faster process
      TestOne(RestClient);                                                             // <<=== DO NOT Work !!!!
    finally
      RestClient.Free;
    end;
  finally
    RestServer.Free;
  end;
end;

我也试着把这个问题放在mORMot论坛上,但是邮件发不到。收到以下消息:

遇到错误:无法发送电子邮件。请联系论坛管理员,并提供SMTP服务器报告的以下错误消息:"450 4.1.2:收件人地址被拒绝:找不到域“。

EN

回答 1

Stack Overflow用户

发布于 2019-08-01 17:26:31

我终于找到问题所在了。在聚合类TPackage中,我将packageNo的属性设置为"stored AS_UNIQUE“-这导致提交只是在该字段中存储零,然后SELECT('packageNo=?,10001)无法找到任何内容。我没有意识到这一点,因为package对象只包含10001,并且从来没有想过提交应该存储0的可能性。但是,当我使用TSQLHttpServer和TSQLHttpClient以及一个实际的数据库进行测试时,我可以看到packageNo字段中包含零的所有记录。然后我明白了,一定是这个领域出了问题。当我查找TPackage时,我发现了我的错误。我应该在TSQLRecordPackage类中设置“存储的AS_UNIQUE”,即ORM所使用的那个。

这个故事的寓意..。“睁开你的眼睛,你就会看到”;-)

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

https://stackoverflow.com/questions/57285353

复制
相关文章

相似问题

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