【问题标题】:"An entity object cannot be referenced by multiple instances of IEntityChangeTracker" error while trying to save entity to bd尝试将实体保存到 bd 时出现“IEntityChangeTracker 的多个实例无法引用实体对象”错误
【发布时间】:2014-07-02 08:41:17
【问题描述】:

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

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

这是我的接口 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 的多个实例无法引用实体对象,但是我发送了新实例,所以我真的不明白为什么会出现此错误以及如何解决此问题。任何帮助表示赞赏。

【问题讨论】:

  • 我敢打赌这会发生在您按下按钮的...?
  • 第一次按时也会出现这种情况
  • 在此之前您是否在上下文中加载了实体?
  • 是的,我正在加载值(以在表单上显示信息)并将它们保存到 observableCollection。这个集合我绑定到组合框。在按下 ButtonClick 后,我想将所选值的 IsValid 设置为 0 并将更改保存到 db

标签: c# entity-framework asynchronous


【解决方案1】:

我想我找到了解决办法。 我已将 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;
    }
}

希望这会对某人有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多