我正在客户端上使用AngularJS构建应用程序,并在后端使用ASP.NET WebAPI / Entity Framework。
我需要确保存储或回滚完整的事务,而不是依赖纯粹的RESTful服务。因此,我编写了一个JavaScript UnitOfWork实现,它跟踪每个加载的对象,并按类型单独存储它们。
持久存在时遇到了问题。
想象一下,我通过Web API加载了以下对象:
{
FirstName: "Bob",
LastName: "Jensen",
Email: "test@example.com",
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'的实体失败,因为同一类型的另一个实体已具有相同的主键值。使用'附加'方法或将实体的状态设置为“未更改”#39;或者'修改'如果图中的任何实体具有冲突的键值。这可能是因为某些实体是新的并且尚未收到数据库生成的键值。在这种情况下,请使用'添加'方法或“添加”#39;实体状态跟踪图形,然后将非新实体的状态设置为“未更改”。或者'修改'酌情。
我的第一个想法是在将不需要的属性发送回服务器之前去除它们 - 所以在我上面的JSON中,我应该发回一个类似的结果,但是没有“国家/地区”。和动物'属性。我仍然想保留CountryID。
答案 0 :(得分:0)
通过删除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很高兴,我通过不发送整个图表来节省少量带宽。