2015-02-06 64 views
1

我在我的MVC應用程序上使用async/await,當調用context.SaveChangesAsync()(它甚至發生在不使用異步時)時,我得到一個DataException更新拋出DataException

我實施的工作單元模式發現here我試過了一切,改變代碼,使用同步代替,評論調用線等我沒有想法。我的實體不會更新。但他們確實得到了創造性思維。

這裏是我的一段代碼:

// Inside POST EDIT 
try { 
    if (ModelState.IsValid) { 
     unitOfWork.StudentRepository.Update(student); 
     await unitOfWork.SaveAsync(); 
     return RedirectToAction("Index"); 
    } 
} catch (DataException) { 
    ModelState.AddModelError("", "Unable to save changes. Try again, and if the problem persist see your system administrator"); 
} 

// Inside Repository -- It's a generic type defined as 

// public class GenericRepository<TEntity> : IGenericRepository<TEntity> 
// where TEntity : class { ....... 

public GenericRepository(SchoolContext context) { 
    this.context = context; 
    this.dbSet = context.Set<TEntity>(); 
} 

public virtual void Update(TEntity entityToUpdate) { 
    dbSet.Attach(entityToUpdate); 
    context.Entry(entityToUpdate).State = EntityState.Modified; 
} 

// Inside UnitOfWork 
public Task<int> SaveAsync() { 
    return context != null ? context.SaveChangesAsync() : Task.FromResult<int>(1); 
} 

更新:做了許多研究後,我發現人們使用剪斷這樣的代碼:

public void ApplyStateChanges() 
{ 
    foreach (var dbEntityEntry in ChangeTracker.Entries()) 
    { 
     var entityState = dbEntityEntry.Entity as EntityBase; 
     if (entityState == null) 
      throw new InvalidCastException("All entites must implement the IObjectState interface, " + 
              "this interface must be implemented so each entites state can explicitely determined when updating graphs."); 

     dbEntityEntry.State = StateHelper.ConvertState(entityState.State); 
    } 
} 

SaveChangesAsync()之前調用它,這與我面臨的問題有什麼關係?

更新2:這是我點擊Copy exception detail to the clipboard時得到的結果。

我試圖改變的代碼使用TryToUpdateModel(),並沒有拋出異常,但數據不更新反正

+0

發佈完整的例外和堆棧跟蹤! – 2015-02-06 22:06:59

+0

請發佈來自異常和它的內部異常(如果存在)的消息。錯誤*可能與你的代碼無關,並且與沒有找到的數據庫或表與對象之間的列不匹配有關。 – 2015-02-06 22:21:36

+0

我從'DataException'發佈了一個鏈接到我的堆棧跟蹤,希望這可以幫助我解決問題 – 2015-02-06 22:30:41

回答

0

我真的希望沒有其他人都會經歷這個。所以,問題是以下幾點:

我在DbContext,這樣我可以做到在每一個實體的時間戳與CreatedDateUpdatedDate性質重寫SaveChanges()SaveChangesAsync()通過ITimestamp

更新您不要修改CreatedDate的時候,因爲它得到一個null值,C#似乎並不爲允許空上DateTime

所以爲了解決這個問題,我marketd它作爲未修飾像這裏面我重寫保存方法:

if (entry.State == EntityState.Modified) { 
    Entry(entry.Entity as ITimestamp).Property(e => e.CreatedDate).IsModified = false; 
}