【问题标题】:Delphi - mORMot Can not access data through client using full memory model and TSQLRestClientURIDelphi - mORMot 无法通过使用完整内存模型和 TSQLRestClientURI 的客户端访问数据
【发布时间】:2019-07-31 07:24:27
【问题描述】:

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

我已尝试最小化代码,希望它可以包含一些线索,以帮助我了解这里出了什么问题。 我发现只使用服务器时,一切正常,但使用客户端时,ORMselection 找不到数据。 我尽可能地剥离了代码,并用一些 cmets 标记了它在哪些地方可以工作,哪些地方不能工作。

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: Recipient address denied: Domain not found”。

【问题讨论】:

    标签: delphi mormot


    【解决方案1】:

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

    故事的寓意...“睁开你的眼睛......你会看到”;-)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-21
      • 2021-01-01
      相关资源
      最近更新 更多