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

Den*_*rie 4 sql breeze

我的应用程序中有以下非常标准的Breeze API Controller端点:

    public SaveResult SaveChanges(JObject saveBundle)
    {
        return _contextProvider.SaveChanges(saveBundle);
    }
Run Code Online (Sandbox Code Playgroud)

我的后端数据库使用配置为身份的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);
    }
Run Code Online (Sandbox Code Playgroud)

保存失败并显示错误:

保存或接受更改失败,因为"xxxx.App_Data.AspNetUser"类型的多个实体具有相同的主键值.确保显式设置的主键值是唯一的.确保在数据库和Entity Framework模型中正确配置了数据库生成的主键.使用实体设计器进行数据库优先/模型优先配置.使用'HasDatabaseGeneratedOption'流畅API或'DatabaseGeneratedAttribute'进行Code First配置.

鉴于我在做什么,这是预期的行为吗?有没有其他方法可以在SaveChanges调用之前进行初始的单独查询而不会破坏某些内容并使查询失败?

Ste*_*itt 7

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

这篇SO帖子给出了关于创建第二个Context的一些提示.