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.

Мораль этой истории... "ОТКРОЙ СВОИ ГЛАЗА.. и ты увидишь";-)

Другие вопросы по тегам