簡體   English   中英

Delphi-mORMot無法使用完整內存模型和TSQLRestClientURI通過客戶端訪問數據

[英]Delphi - mORMot Can not access data through client using full memory model and TSQLRestClientURI

我一直在嘗試使用mORMOt DDD方式啟動一個新項目,並創建了一些類並開始以簡單/簡單的方式測試其中的一個。 我使用了DDD樣本中有關TUser的回歸測試代碼,並對其進行了修改以適合我的課程。

我已嘗試將代碼最小化,並希望其中可能包含一些線索,可幫助您了解此處的問題。 我發現僅使用服務器時,一切正常,但是使用客戶端時,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;

我也嘗試將這個問題放在mORMot論壇上,但郵件無法到達該站點。 得到此消息:

遇到錯誤錯誤:無法發送電子郵件。 請通過SMTP服務器報告以下錯誤消息與論壇管理員聯系:“ 450 4.1.2:收件人地址被拒絕:找不到域”。

我終於找到了問題所在。 在聚合類TPackage中,我已將packageNo的屬性設置為“ stored AS_UNIQUE”-結果是提交僅在該字段中存儲了零,然后找不到SELECT('​​packageNo = ?, [10001])任何東西。 我沒有意識到,因為包對象僅包含10001,並且從未想到提交應該存儲0的可能性。但是當我使用TSQLHttpServer和TSQLHttpClient和真實數據庫進行測試時,我可以在packageNo中看到所有包含零的記錄。領域。 然后我了解到該字段一定是錯誤的。 當我查看TPackage時,我發現了我的錯誤。 我應該在TSQLRecordPackage類中設置“ STORED AS_UNIQUE”,這是ORM使用的類。

故事的寓意……“睜開眼睛,然后你會看到” ;-)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM