我的应用程序中有以下非常标准的Breeze API Controller端点:
public SaveResult SaveChanges(JObject saveBundle)
{
return _contextProvider.SaveChanges(saveBundle);
}
我的后端数据库使用配置为身份的int ID。
从具有有效更改集的客户端调用时,一切都很顺利。
但是,如果在致电_contextProvider.SaveChanges(saveBundle) function
之前,我会进行任何形式的查询。例如:
public SaveResult SaveChanges(JObject saveBundle)
{
int incomingUserId = Convert.ToInt32(saveBundle["entities"][0]["Id"]);
AspNetUser EditedUser = (from u in Context.AspNetUsers where u.Id == incomingUserId select u).FirstOrDefault();
// ......
// do something with the EditedUser (like validations of any sort)
// ......
return _contextProvider.SaveChanges(saveBundle);
}
保存失败,错误:
保存或接受更改失败,因为多个类型的实体&x; xxxx.App_Data.AspNetUser'具有相同的主键值。确保显式设置的主键值是唯一的。确保在数据库和Entity Framework模型中正确配置了数据库生成的主键。使用实体设计器进行数据库优先/模型优先配置。使用' HasDatabaseGeneratedOption"流利的API或“DatabaseGeneratedAttribute”#39;用于Code First配置。
鉴于我在做什么,这是预期的行为吗?有没有其他方法可以在SaveChanges调用之前进行初始的单独查询,而不会破坏某些内容并使查询失败?
答案 0 :(得分:6)
您需要创建第二个Context来执行查询。在上面的代码中,EditedUser
对象正在上下文中缓存,因为这是EF的作用。然后,当调用_contextProvider.SaveChanges(saveBundle)
时,contextProvider会尝试在同一个Context中创建具有相同类型和相同键的对象。因此错误。
This SO post给出了关于创建第二个上下文的一些提示。