C#OData更新未跟踪的实体而不从数据库

时间:2016-08-31 19:12:59

标签: c# odata uwp

我的通用Windows应用程序中有一个本地SQLite数据库,我想用OData将实体中的一些更改更新为REST-API服务器。 当我尝试更新时只使用:

context.UpdateObject(entity);
context.SaveChangesAsync();

我收到错误消息:

  

上下文目前没有跟踪实体。

我知道我可以从服务器获取实体,更新并再次保存,但这意味着我必须手动将本地实体的所有属性复制到从服务器获取的属性。 我也不认为每次要更新时都能从服务器上读取整个实体

1 个答案:

答案 0 :(得分:1)

正如错误The context is not currently tracking the entity.所述,此处的问题是您的entity未跟踪context

tutorial,我们可以在更新实体下找到以下注释:

  

context将跟踪您对附加到其中的实体所做的所有更改(通过从您将其附加到person的服务中获取context)并发送请求调用SaveChanges时更改。

因此,默认情况下,会跟​​踪查询返回的实体。因此,当我们调用DataServiceContext.SaveChangesAsync方法时,可以将这些实体的更改发送回数据服务。但由于查询未检索到您的实体,因此在调用SaveChangesAsync方法时会出现此错误。

要解决此问题,我们可以使用DataServiceContext.AttachTo方法附加实体。如果我们使用DataServiceContext.AttachTo附加实体,DataServiceContext将跟踪该实体。以下是一个简单的示例:

private async void Button_Click(object sender, RoutedEventArgs e)
{
    var context = new DefaultContainer(new Uri("http://services.odata.org/v4/(S(lqbvtwide0ngdev54adgc0lu))/TripPinServiceRW/"));

    var person = new Person
    {
        UserName = "russellwhyte",
        FirstName = "Jay",
        LastName = "Zuo"
    };

    context.AttachTo("People", person, "*");

    context.UpdateObject(person);

    await context.SaveChangesAsync();

    var personUpdated = await context.People.ByKey("russellwhyte").GetValueAsync();

    System.Diagnostics.Debug.WriteLine($"{personUpdated.UserName} : {personUpdated.FirstName} {personUpdated.LastName}");
}

有关详细信息,请参阅Client Tracking