1

EntityManagerドキュメントは、リクエストごとに new を使用する必要があることを強調しており、それを自動的に生成するためのミドルウェアや、代わりに使用できるem.fork(). ここまでは順調ですね。

これEntityRepositoryは、コードを読みやすくする優れた方法です。EntityManagerそれらがインスタンスにどのように関連しているかについてのドキュメントには何も見つかりませんでした。この例では、リポジトリとミドルウェアexpress-ts-example-appの単一インスタンスを使用しています。RequestContextこれは、EntityManager少なくともRequestContext. 本当にそうですか?

また、EM を手動でフォークした場合でも、正しいものを見つけることができますか? 次の例を検討してください。

(async () => {
  DI.orm = await MikroORM.init();
  DI.em = DI.orm.em;
  DI.companyRepository = DI.orm.em.getRepository(Company);
  DI.invoiceRepository = DI.orm.em.getRepository(Invoice);
  ...
  fetchInvoices(em.fork());
}

async function fetchInvoices(em) {
  for (const company of await DI.companyRepository.findAll()) {
    fetchInvoicesOfACompany(company, em.fork())
  }
}

async function fetchInvoicesOfACompany(company, em) {
  let done = false;
  while (!done) {
    const invoice = await getNextInvoice(company.taxnumber, company.lastInvoice);
    if ( invoice ) {
      DI.invoiceRepository.persist(invoice);
      company.lastInvoice = invoice.id;
      em.flush();
    } else {
      done = true;
    }
  }
}

は正しい EM インスタンスDI.invoiceRepository.persist()を使用していますか? fetchInvoicesOfACompany()そうでない場合は、どうすればよいですか?

また、私が間違っていなければ、em.flush()infetchInvoicesOfACompany()は会社を更新しません。これは別の EM に属しているためです。このような状況をどのように処理すればよいですか?

4

1 に答える 1