2014-04-07 31 views
0

我想更新一個BreezeJS實體時,我調整了一個單一的屬性,沒有別的(我沒有做刪除)。我收到以下錯誤信息:BreezeJS總是返回存儲更新,插入或刪除語句影響保存更改上意想不到的行數

{「$ id」:「1」,「$ type」:「System.Web.Http.HttpError,System.Web.Http」,「Message」:「An error has發生「,」ExceptionMessage「:」存儲更新,插入或刪除語句影響了意外數量的行(0)。實體可能已被修改或刪除,因爲實體已加載刷新ObjectStateManager條目「,」ExceptionType「:」 System.Data.Entity.Infrastructure.DbUpdateConcurrencyException「,」StackTrace「:」在System.Data.Entity.Internal.InternalContext.SaveChanges()\ r \ n在Breeze.ContextProvider.EF6.EFContextProvider`1.SaveChangesCore(SaveWorkState saveWorkState) \ r \ n在Breeze.ContextProvider.ContextProvider.OpenAndSave(SaveWorkState saveWorkState)\ r \ n在Breeze.ContextProvider.ContextProvider.SaveChanges(JObject saveBundle,TransactionSettings transactionSettings)\ r \ n在Toriga.Prototype.Html5Portal.Controllers.DataController。薩veChanges(JObject saveBundle)

我被告知這是一個併發異常,但我總是數據庫的唯一用戶,所以它不能。我已經檢查過返回的數據對象的主鍵是否具有正確的主鍵。

我的微風控制器:

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); 

    } 

我們使用客戶端的(多簡寫爲)工藝是先「同步」的數據,本地存儲和以後更新的任何變化。

Firstlyt,在本地存儲加載數據和存儲:

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); 
       }); 

,我們總是得到上述錯誤。數據模型非常複雜,儘管我所做的改變是微不足道的。抱歉代碼示例很簡短,但是它來自一個更大的項目,它有許多依賴關係。我挑出了要點。任何幫助或線索,看看爲什麼會發生這種情況將不勝感激,似乎沒有太多關於這個問題。

回答

0

我會首先刪除數據庫上的併發檢查,看看錯誤是否消失。

如果是這樣,我的猜測是,它會,那麼問題很可能要麼

  • ,你必須在你的出口,並重新導入實體的「老」併發值。 (提供我正確理解您的問題)或
  • 您正在對同一個實體進行多次保存是連續的,並且併發值在第一次保存後沒有正確返回到此客戶端。如果您使用WebApiOData適配器而不是默認的WebApi適配器,則可能會發生這種情況。
1

事實證明,我有一個數據庫管理員有幫助地插入的rowversion字段,這是每次更改都更新記錄。一旦我刪除了這個,一切都很順利

相關問題