我在我的async/await
应用程序上使用MVC
,并且在调用DataException
时得到context.SaveChangesAsync()
(甚至在不使用异步时也会发生)。
我实现了工作单元模式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 :(得分:0)
您是否尝试过异步TransactionScope?
答案 1 :(得分:0)
我真的希望没有其他人经历过这个。所以问题如下:
我在SaveChanges()
上覆盖了SaveChangesAsync()
和DbContext
,以便我可以通过ITimestamp
CreatedDate
和{{1}对每个实体进行时间戳记属性。
由于更新时您没有修改UpdatedDate
,因此获得CreatedDate
值,null
似乎不允许{{1} }}
因此,为了解决这个问题,我在我的覆盖保存方法中将其作为非修改方式推销:
C#