调用SaveChanges之前的Breeze JS Query会导致失败

时间:2014-06-18 18:30:53

标签: sql breeze

我的应用程序中有以下非常标准的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调用之前进行初始的单独查询,而不会破坏某些内容并使查询失败?

1 个答案:

答案 0 :(得分:6)

您需要创建第二个Context来执行查询。在上面的代码中,EditedUser对象正在上下文中缓存,因为这是EF的作用。然后,当调用_contextProvider.SaveChanges(saveBundle)时,contextProvider会尝试在同一个Context中创建具有相同类型和相同键的对象。因此错误。

This SO post给出了关于创建第二个上下文的一些提示。