如何在OData中跟踪实体?

时间:2013-10-22 16:03:01

标签: php odata

我正在使用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);时,我没有得到上述异常?

1 个答案:

答案 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()以某种方式阻止代理跟踪对象吗?