我正在使用PHP OData sdk(odata.org),我正在尝试在新对象和两个现有对象之间添加链接:
//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 :(得分: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
,但它们自己有链接,我在原始请求中Expand()
,然后将这些链接作为参数发送到{{1}功能。可能是addB()
以某种方式阻止代理跟踪对象吗?