![](/img/trans.png)
[英]How can you create JSON manually using Delphi with the Mormot library?
[英]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.