试图加载元数据两次的学说。课程' x'在链配置的命名空间中找不到

时间:2014-07-18 16:47:00

标签: php symfony doctrine-orm legacy behat

因此,我们尝试在一些正在慢慢迁移到Symfony2的遗留项目中安装Behat。

对于我们打算在内存中使用sqlite数据库的测试环境,我们尝试reset doctrine using this example

但不幸的是,在尝试运行测试时我们遇到了错误:

  

[学说\共同\持久性\映射\ MappingException]
  在场景"之前已经出现例外情况。钩子,定义于   公司\ Features \ Context \ FeatureContext :: prepareDbSchema()

     

班级'实体\ ChanceCreationRate \ LevelScorelineRateCalculator'   在链配置的命名空间中找不到   公司\ ModelBundle \实体

经过一些调试后,我们注意到doctrine成功加载了该实体的元数据,但后来它再次尝试加载它,然后我们得到了这个错误。

我们有2个实体管理器,并在config.yml

中进行手动映射
entity_managers:
  default:
    connection: default
    mappings:
      legacy:
        type: yml
        prefix: Entities
        dir: %kernel.root_dir%/../entities/metadata
        is_bundle: false
      CompanyGameBundle: ~
      CompanyModelBundle: ~ # Temporary until db split
      CompanyShotStatsBundle: ~
      CompanySiteBundle: ~
      CompanyTeamStrengthBundle: ~
      CompanyTrainingBundle: ~
      CompanyUserBundle: ~
      CompanyWatcherBundle: ~
      CompanyWorldBundle: ~
      CompanyWorldCupBundle: ~
  model:
    connection: model
    mappings:
      CompanyModelBundle: ~

我觉得ModelBundle在他们身上可能都有错,但必须是这样ATM或一切都会制动。

此实体的正确名称空间是"实体"并属于"遗产"映射。

有任何建议,如何修复它的提示?怎么了?

修改

所以我找到并理智并感觉现在有点愚蠢...... ModelBundle中的一个实体与遗留代码中的少数实体有关系(幸运的是他们没有任何进一步的关系), 和doctrine尝试在通过模型EM映射时加载它们。这就是我们正在重构的过程:/

所以现在的问题是:我可以在映射而不是目录中指定显式文件的映射,或者在最终移动所有实体并重构与ModelBundle相关的代码之前,我将无法继续吗?

1 个答案:

答案 0 :(得分:0)

正如您所知,彼此关联的所有实体必须在同一个EntityManager中具有映射定义。这是因为一个EntityManager不知道任何其他EntityManagers,不会(并且不能)互相交谈。并且一个EntityManager需要知道它管理的所有实体的映射定义。这是设计的。

所以我建议你按照现在的方式行事。在完全将所有关联实体移出旧环境之前,请在两个EntityManage中都有CompanyModelBundle

可能的替代

如果您正在执行此操作,因为您将转移到新数据库,并且两个数据库都由同一服务提供(单个主机上的单个MySQL实例包含两个数据库/架构&#39 ;例如),还有另一种选择:

确保两个数据库都可以由同一个用户访问这两个数据库(因此您可以使用单个Doctrine Connection)。

映射您的实体,以便它们指定表所在的数据库。使用Annotations,它将如下所示:

/**
 * @ORM\Entity
 * @ORM\Table(name="some_database.some_table")
 */
class SomeEntity

现在,您可以安全地将一个数据库中的一个实体与另一个数据库中的另一个实体相关联。

通过这种方式,您可以(并且必须为此工作)对两个数据库使用单个EntityManager,并将当前的一个实体移动到新数据库。