Delphi-mORMot无法使用完整内存模型和TSQLRestClientURI通过客户端访问数据

Delphi-mORMot无法使用完整内存模型和TSQLRestClientURI通过客户端访问数据,delphi,mormot,Delphi,Mormot,我一直在尝试以DDD方式使用mORMOt启动一个新项目,并创建了几个类,并开始以简单/简单的方式测试其中一个类。 我使用了您关于TUser的DDD示例中的回归测试代码,并对其进行了修改以适合我的类 我试图最小化代码,希望它能为您提供一些线索,帮助我理解这里的错误。 我发现当只使用服务器时,一切正常,但当使用客户端时,ORMselection找不到数据。 我尽可能地精简了代码,并用一些注释标记了代码在哪里工作,在哪里不工作 class procedure TInfraRepoPackageFact

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

我试图最小化代码,希望它能为您提供一些线索,帮助我理解这里的错误。 我发现当只使用服务器时,一切正常,但当使用客户端时,ORMselection找不到数据。 我尽可能地精简了代码,并用一些注释标记了代码在哪里工作,在哪里不工作

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;
类过程tinfrarepospackagefactory.RegressionTestsPackage(测试:TSynTestCase);
程序TestOne(Rest:TSQLRest);
var cmd:IDomPackageCommand;
qry:IDomPackageQuery;
包装:t包装;
开始
test.Check(Rest.Services.Resolve(IDomPackageCommand,cmd));
package:=TPackage.Create;
尝试
包装件编号:=10000;
测试检查(命令添加(包)=cqrsSuccess);
结束;
test.check(cmd.Commit=cqrsSuccess);
最后
套餐。免费;
结束;
package:=TPackage.Create;
尝试
test.Check(Rest.Services.Resolve(IDompackageQuery,qry));

测试。检查(qry.SelectByArticleNo(10000,false)=cqrsSuccess);// 我终于找到了问题所在。 在agregate类TPackage中,我将packageNo的属性设置为“存储为_UNIQUE”-这导致提交只在该字段中存储了零,然后SELECT('packageNo=?,[10001])找不到任何内容。 我没有意识到这一点,因为包对象只包含10001,并且永远不会想到提交应该存储0的可能性。 但是当我使用TSQLHttpServer和TSQLHttpClient以及一个真实的数据库进行测试时,我可以在packageNo字段中看到所有包含零的记录。 然后我明白了一定是这个领域出了问题。我查了一下包装,发现了我的错误。 我应该在TSQLRecordPackage类中设置“存储为_UNIQUE”,而不是ORM使用的那个


这个故事的寓意。。。“睁开你的眼睛……你就会看到”——)

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

这个故事的寓意。。。“睁开你的眼睛……你就会看到”——)