我的通用Windows应用程序中有一个本地SQLite数据库,我想用OData将实体中的一些更改更新为REST-API服务器。 当我尝试更新时只使用:
context.UpdateObject(entity);
context.SaveChangesAsync();
我收到错误消息:
上下文目前没有跟踪实体。
我知道我可以从服务器获取实体,更新并再次保存,但这意味着我必须手动将本地实体的所有属性复制到从服务器获取的属性。 我也不认为每次要更新时都能从服务器上读取整个实体。
答案 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。