更新正在抛出DataException

时间:2015-02-06 21:54:21

标签: c# entity-framework

我在我的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()并且它不会抛出异常,但数据仍未更新

2 个答案:

答案 0 :(得分:0)

您是否尝试过异步TransactionScope?

https://msdn.microsoft.com/enus/data/dn456843.aspx

答案 1 :(得分:0)

我真的希望没有其他人经历过这个。所以问题如下:

我在SaveChanges()上覆盖了SaveChangesAsync()DbContext,以便我可以通过ITimestamp CreatedDate和{{1}对每个实体进行时间戳记属性。

由于更新时您没有修改UpdatedDate,因此获得CreatedDate值,null似乎不允许{{1} }}

因此,为了解决这个问题,我在我的覆盖保存方法中将其作为非修改方式推销:

C#