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