2013-10-22 67 views
0

我使用PHP的OData SDK(odata.org),我试图添加一个新的对象和现有的两个对象之间的链接:如何跟踪OData中的实体?

//Add a new object to the database. Pass in objects $v and $o. 
public function addB($v,$o) { 

    //Create a new object 
    $b = new B(); 
    $b->V = $v; 
    $b->O = $o; 

    //Add a link between my objects 
    $proxy->AddLink($b, 'V', $v); 
    $proxy->AddLink($b, 'O', $o); 

    $proxy->SaveChanges(); 
} 

的odata.org网站上的使用产生指令生成代理类等。

我收到以下异常消息:

The context is not currently tracking the entity. 

翻译作为代理类还没有到任何地方存储的对象$v$o参考。将一个对象添加到代理类的引用的一个方法是:

$proxy->AddToVCollection($v); 

我这样做,并试图挽救我得到主键冲突,因为它是那么努力的$v对象保存为一个新的条目时除外。

那么,如何让我的代理类跟踪我的对象$v$o因此,当我做$proxy->AddLink($b, 'V', $v);我没有得到上述异常?

回答

0

不知为何物$v$o出的参数没有被跟踪,但我不得不从代理重新给他们打电话之前,我可以将它们添加到对象$b

//Add a new object to the database. Pass in objects $v and $o. 
public function addB($v,$o) { 

    //Recreate my existing objects from Service 
    $o = $proxy->OCollection()->Filter("id eq '".$o->getId()."'")->Execute()->Result[0]; 
    $v = $proxy->VCollection()->Filter("id eq '".$v->getId()."'")->Execute()->Result[0]; 

    //Create a new object 
    $b = new B(); 
    $b->V = $v; 
    $b->O = $o; 

    //Add a link between my objects 
    $proxy->AddLink($b, 'V', $v); 
    $proxy->AddLink($b, 'O', $o); 

    $proxy->SaveChanges(); 
} 

当您调用Execute时,代理将开始跟踪对象。在这种情况下,我只需要链接对象$v$o,但它们本身具有链接本身,它们在原始请求中我将它们作为参数发送给addB()函数。难道是Expand()以某种方式阻止代理跟踪对象?