一个实体对象不能被多个IEntityChangeTracker"试图将实体保存到bd时出错

本文关键字:实体 保存 bd quot 出错 IEntityChangeTracker 一个 对象 不能 | 更新日期: 2023-09-27 18:11:10

我正在尝试以异步方式更新实体。这就是我的更新方法的样子

public async Task<bool> UpdateEntityAsync<T>(IDbContext source, T entity) where T : class 
{
    try
    {
        source.Entry(entity).State = EntityState.Modified; // here I get error
        await source.SaveChangesAsync();
        return true;
    }
    catch (Exception ex)
    {
        return false;
    }
}

This is my Interface IDbContext

public interface IDbContext
{
    DbSet<T> Set<T>() where T: class;
    Task<int> SaveChangesAsync();
    DbEntityEntry<T> Entry<T>(T entity) where T : class;
}

和我调用方法UpdateEntityAsync从按钮点击

public async override void ButtonClick(object sender)
{
    ComboboxSelectedValue.IsValid = 0;
    var result = await ViewModel.Instance.Repository.UpdateEntityAsync(new Entities(), ComboboxSelectedValue);
    if (result)
    {
        StatusBarText = "Changed";
        return;
    }
    StatusBarText = "Some error, record's state not changed!";
}

所以错误说一个实体对象不能被IEntityChangeTracker的多个实例引用,但我发送新的实例,所以我真的不明白为什么我得到这个错误以及如何解决这个问题。

一个实体对象不能被多个IEntityChangeTracker"试图将实体保存到bd时出错

我想我找到解决办法了。我把IDbContext改成

public interface IDbContext
{
    DbSet<T> Set<T>() where T: class;
    Task<int> SaveChangesAsync();
    void MarkAsModified<T>(T entity) where T : class;
}

然后实现了MarkAsModified:

public void MarkAsModified<T>(T entity) where T : class
{
    Entry(entity).State = EntityState.Modified;
}

现在我的UpdateEntityAsync看起来像

public async Task<bool> UpdateEntityAsync<T>(IDbContext source, T entity) where T : class 
{
    try
    {
        source.MarkAsModified(entity);
        await source.SaveChangesAsync();
        return true;
    }
    catch (Exception ex)
    {
        return false;
    }
}

希望对大家有所帮助