2013-10-22 112 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()以某種方式阻止代理跟蹤對象?