我在客户端上使用AngularJS构建应用程序,在后端使用ASP.NET WebAPI / Entity Framework。
我需要确保不存储或回滚完整的事务,而不是仅仅依靠RESTful服务。因此,我编写了一个JavaScript UnitOfWork实现,该实现跟踪每个加载的对象,并按类型分别存储它们。
我坚持他们时遇到了一个问题。
想象一下,我通过Web API加载了以下对象:
{
FirstName: "Bob",
LastName: "Jensen",
Email: "[email protected]",
Country: { ID: 61, Name = "Zimbabwe"},
CountryID: 61,
Animals: [
{ Name: "Mittens", ID: 2},
{ Name: "Rex", ID: 1}
]
}
现在,假设我更改了Bobs LastName,并希望保存它。我将UoW发送到服务器,并在EF上下文中,对已编辑的对象执行以下操作(到此为止,没有代码可以触摸obj):
databaseContext.Entry(obj).State = EntityState.Modified;
这给我这样的错误:
附加类型为'MyApp.Model.Country'的实体失败,因为相同类型的另一个实体已经具有相同的主键值。如果图形中的任何实体具有相互冲突的键值,则使用“附加”方法或将实体的状态设置为“不变”或“修改”时,可能会发生这种情况。这可能是因为某些实体是新实体,尚未收到数据库生成的键值。在这种情况下,请使用“添加”方法或“已添加”实体状态来跟踪图形,然后根据需要将非新实体的状态设置为“未更改”或“已修改”。
我的第一个想法是删除不需要的属性,然后再将其发送回服务器-因此,在我上面的JSON中,我应该将类似的结果发送回去,但是没有“ Country”和“ Animals”属性。我仍然想保留CountryID。
设法通过删除我的JavaScript对象上的集合和对象引用来使其工作:
var clone = {};
for (prop in obj) {
if (typeof obj[prop] == "string" || typeof obj[prop] == "number" || typeof obj[prop] == "boolean") {
clone[prop] = obj[prop];
}
}
现在,EF很高兴,并且我不发送整个图就节省了很小的带宽。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句