Delphi - mORMot Невозможно получить доступ к данным через клиента, используя модель с полной памятью и 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: Адрес получателя отклонен: домен не найден".
1 ответ
Я наконец нашел, что не так. В агрегате класса TPackage я установил для свойства packageNo значение "сохранено AS_UNIQUE", в результате чего коммит просто сохранил ноль в этом поле, а затем SELECT('packageNo=?,[10001]) не удалось найти что-нибудь. Я не осознавал этого, потому что объект пакета содержал только 10001 и никогда не мог подумать о том, что коммит должен хранить 0. Но когда я тестировал с TSQLHttpServer и TSQLHttpClient и реальной базой данных, я мог видеть все записи, содержащие нули в packageNo поле. Тогда я понял, что с этим полем должно быть что-то не так. Когда я посмотрел TPackage, я нашел свою ошибку. Я должен был установить "STORED AS_UNIQUE" в классе TSQLRecordPackage, который используется ORM.
Мораль этой истории... "ОТКРОЙ СВОИ ГЛАЗА.. и ты увидишь";-)