BreezeJS始终返回Store更新,插入或删除语句,这些语句会影响savechanges上的意外行数

时间:2014-04-07 14:38:29

标签: entity-framework angularjs breeze

我正在尝试更新BreezeJS实体,当我调整单个属性时没有别的(我没有删除)。我收到以下错误消息:

{" $ id":" 1"," $ type":" System.Web.Http.HttpError,System.Web.Http& #34;,"消息":"发生错误。"," ExceptionMessage":"存储更新,插入或删除语句受影响意外的行数(0)。自实体加载后,实体可能已被修改或删除。刷新ObjectStateManager条目。"," ExceptionType":" System.Data.Entity.Infrastructure.DbUpdateConcurrencyException"," StackTrace":" at Breeze.ContextProvider.EF6.EFContextProvider`1.SaveChangesCore(SaveWorkState saveWorkState)\ r \ n的System.Data.Entity.Internal.InternalContext.SaveChanges()\ r \ n在Breeze.ContextProvider.ContextProvider.OpenAndSave(SaveWorkState saveWorkState) \ r \ n在Breeze.ContextProvider.ContextProvider.SaveChanges(JObject saveBundle,TransactionSettings transactionSettings)\ r \ n at Toriga.Prototype.Html5Portal.Controllers.DataController.SaveChanges(JObject saveBundle)in

我被告知这是一个并发异常,但我始终是数据库的唯一用户,所以它不可能。我已检查返回的数据对象的主键是否具有正确的主键。

我的微风控制器:

    readonly EFContextProvider<Context> _contextProvider = new EFContextProvider<Context>();

    public DataController(IUserManager userManager) : base(userManager) { }

    // ~/breeze/Data/Metadata
    [HttpGet]
    public string Metadata()
    {
        return _contextProvider.Metadata();
    }

    // ~/breeze/Data/Jobs
    [HttpGet]
    public async Task<IQueryable<Work>> Jobs()
    {

        var currentUser = await UserManager.FindById(Guid.Parse(User.Identity.GetUserId()));
        var companyId = currentUser.CompanyId.Value;
        return _contextProvider.Context.WorkFolder.Where(w => w.CompanyId == companyId).SelectMany(i => i.Works).Where(j => j.IsDeleted == false);

    }

我们使用客户端的(更加简化的)流程是最初&#39;同步&#39;数据,本地存储并在以后更新任何更改。

首先,加载数据并存储在本地存储中:

  var jobsQuery = new breeze.EntityQuery.from("Jobs");
  em.fetchMetadata().then(function () {
  em.executeQuery(jobsQuery).then(function (data) {
     _jobs = data.results;
     var emCache = em.exportEntities();
     store.setItem("EmCache", emCache);
     }, function (data) {
        deferred.reject(data); // passes back unsuccessful
     });
     }, function (data) {
        console.log(data);
        deferred.reject(data); // passes back unsuccessful
  });

然后当他们按下同步时我们发出:

                em.saveChanges().then(function () {
                    deferred.resolve();
                }, function (error) {
                    // fail promise
                    console.log(error);
                    deferred.reject(error.message); 
                });

我们总是得到上面的错误。数据模型非常复杂,尽管我所做的改变是微不足道的。道歉,代码示例很简短,但它来自一个有很多依赖关系的大型项目。我已经完成了要点。任何帮助或线索在哪里看看为什么会发生这种情况将是值得赞赏的,在这个问题上似乎并不多。

2 个答案:

答案 0 :(得分:1)

事实证明我有一个DBA帮助放入的rowversion字段,这是每次更改都会更新记录。一旦我删除了它,一切都很好了

答案 1 :(得分:0)

我首先删除对数据库的并发检查,然后查看错误是否消失。

如果确实如此,我的猜测是,那么问题可能是

  • 你有一个&#39; old&#39;导出和重新导入的实体中的并发值。 (假如我正确理解你的问题)或
  • 您正在对同一个实体执行多次保存是继承,并且在第一次保存后并未正确地将并发值返回给此客户端。如果您使用WebApiOData适配器而不是默认的WebApi适配器,则可能会发生这种情况。