2015-01-26 54 views
2

我有一个AdministratorRole之间的基本OneToMany关系。Symfony2和Doctrine Mysql测试数据库持久性

的拥有方是管理员:

/** 
* @ORM\OneToMany(targetEntity="App\PublicBundle\Entity\Role", mappedBy="administrator", cascade="persist") 
**/ 
private $roles; 

public function __construct() { 
    $this->roles = new ArrayCollection(); 
} 

逆侧角色。

/** 
* @ORM\ManyToOne(targetEntity="App\PublicBundle\Entity\Administrator", inversedBy="roles") 
* @ORM\JoinColumn(name="admin_id", referencedColumnName="admin_id") 
**/ 
private $administrator; 

Administrator可以有很多RolesROLE_ADMINROLE_USER

的代码来保存它们原子是......

$administrator = new Administrator(); 
    $administrator->setName('Mario'); 
    $administrator->setLastname('Superman'); 
    $administrator->setUsername('[email protected]'); 
    $administrator->setPassword('password'); 

    $role_admin = new Role(); 
    $role_admin->setRole('ROLE_ADMIN'); 
    $role_admin->setAdministrator($administrator); 

    $role_user = new Role(); 
    $role_user->setRole('ROLE_USER'); 
    $role_user->setAdministrator($administrator); 

    $administrator->setRoles($role_admin); 
    $administrator->setRoles($role_user); 

    $em->persist($administrator); 
    $em->persist($role_user); 
    $em->persist($role_admin); 
    $em->flush(); 

基本的东西。此代码位于通过Ajax调用的Symfony2控制器中。它抛出一个Integrity constraint violation,他说他不能在admin_id列中放置null,因为它是空的。它还发布了两条说明undefined index role_id的通知。

奇怪的是,行没有保存,但administrators表上的admin_id增加。

更奇怪的是我有一个UnitTest可以做同样的事情(字面意义上是相同的代码),并坚持实体。

那么代码测试代码如何工作,但实时控制器中的相同代码却不行?

编辑:我通过Ajax调用控制器,它不会持续,但如果我直接去使用ajax请求的URL,它会持续两次。阿贾克斯post请求的第二个,当我直接链接到浏览器。我在这里错过了一些基本的东西,因为我有一种自我感觉。

回答

1

答案是我的数据库被命名为test_suite mysql被认为是一个测试数据库。我不知道细节,但似乎每个有名称的数据库都是由特殊规则的mysql调用的。正如我所说,我不知道细节,但我不能在这种数据库中创建事务性插入语句。

当我创建一个名为suit的新数据库时,一切正常。

This blog post 并没有说在测试数据库中禁止事务性插入语句,但似乎将数据库的名称命名为test_似乎是个好主意。我不知道这一点,并不得不努力学习它