我一直在尝试使用mORMOt启动一个新项目,创建了几个类,并开始以一种简单的方式测试其中的一个。我使用了您的DDD-sample中关于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:收件人地址被拒绝:找不到域“。
发布于 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所使用的那个。
这个故事的寓意..。“睁开你的眼睛,你就会看到”;-)
https://stackoverflow.com/questions/57285353
复制相似问题