想知道是否有其他人遇到过这个问题。总之,我们从Symfony 2.0升级到了Symfony 2.1。使用Symfony 2.1,如果创建一个全新的捆绑包,然后创建一个实体与Doctrine一起使用,我会得到一个"not a valid entity or mapped super class"
。如果我将相同的实体类(经过适当的路径更改)放入现有的bundle(在2.1之前创建)中,即使从新的bundle也可以毫无问题地访问它。
以下是步骤。
$ php app/console generate:bundle --namespace="Core/TestBundle"--format=yml --no-interaction --structure=no --dir=src
$ php app/console doctrine:generate:entity --entity="CoreTestBundle:Product" --fields="name:string(255) price:float description:text"
这是生成的Product.php代码
<?php
namespace CoreTestBundleEntity;
use DoctrineORMMapping as ORM;
/**
* CoreTestBundleEntityProduct
*
* @ORMTable()
* @ORMEntity
*/
class Product
{
/**
* @var integer $id
*
* @ORMColumn(name="id", type="integer")
* @ORMId
* @ORMGeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string $name
*
* @ORMColumn(name="name", type="string", length=255)
*/
private $name;
/**
* @var float $price
*
* @ORMColumn(name="price", type="float")
*/
private $price;
/**
* @var text $description
*
* @ORMColumn(name="description", type="text")
*/
private $description;
/**
* Get id
*
* @return integer
*/
public function getId()
{
return $this->id;
}
/**
* Set name
*
* @param string $name
* @return Product
*/
public function setName($name)
{
$this->name = $name;
return $this;
}
/**
* Get name
*
* @return string
*/
public function getName()
{
return $this->name;
}
/**
* Set price
*
* @param float $price
* @return Product
*/
public function setPrice($price)
{
$this->price = $price;
return $this;
}
/**
* Get price
*
* @return float
*/
public function getPrice()
{
return $this->price;
}
/**
* Set description
*
* @param text $description
* @return Product
*/
public function setDescription($description)
{
$this->description = $description;
return $this;
}
/**
* Get description
*
* @return text
*/
public function getDescription()
{
return $this->description;
}
}
从这里运行
$ php app/console doctrine:generate:entities "Core/TestBundle/Entity/Product"
或从代码访问产品运行到[DoctrineORMMappingMappingException] Class
CoreTestBundleEntityProduct is not a valid entity or mapped super
class.
运行$ php app/console doctrine:schema:update --force
生成"无需更新"
另一方面,如果我使用预先存在的捆绑包,如ArticleBundle,并运行相同的命令,即
$ php app/console doctrine:generate:entity --entity="CoreArticleBundle:Product" --fields="name:string(255) price:float description:text"
$ php app/console doctrine:generate:entities "Core/ArticleBundle/Entity/Product"
$ php app/console doctrine:schema:update --force
创建表格精细此外,以CoreArticleBundle:Product
的形式从TestBundle访问产品也很好。我试着比较捆绑包的配置等,但什么都拿不出来。
我还按如下方式运行数据库创建脚本。
$ php app/console doctrine:database:drop --force
已删除名为dev 的连接的数据库
$ php app/console doctrine:database:create
已为名为dev的连接创建数据库除了Product表外,所有表都已创建。
此外,我还创建了一个带有Product对象的fixture。同样的事情。在现有捆绑包中工作。在新创建的捆绑包中出现与上述错误相同的错误。
与当地专家交谈。我们的应用程序使用了两个ORM管理器。在这种情况下,每个使用ORM的捆绑包都必须在app/config/config.yml.ie 中注册
entity_managers:
sql_write:
connection: sql_write
mappings:
CoreUserBundle : ~
CoreImageBundle : ~
CoreTestBundle : ~
一个原则:模式:验证应该能帮助你发现错误。。。它将检查您的映射,并检查映射是否与数据库同步。