无法跟踪实体类型 Model 的实例,因为已跟踪具有相同 {'Id'} 键值的另一个实例

2024-01-06

我有一个问题,我什么时候会更新我的数据库,我有这个异常。

无法跟踪实体类型“ExpenseReport”的实例,因为 另一个具有相同键值 {'Id'} 的实例已被使用 被跟踪。附加现有实体时,确保只有一个实体 附加具有给定键值的实例。考虑使用 'DbContextOptionsBuilder.EnableSensitiveDataLogging' 查看 冲突的关键值。已经追踪

这是我进行更新的方法。

      public async Task UpdateExpenseReportForm(Guid ExpenseReportId)
        {
            var totalValue =   _uow.GetReadRepository<ExpenseItem>().FindByCondition(x => x.ExpenseReportId.Equals(ExpenseReportId)).Sum(x => x.Value);

            var expenseReprot = await _uow.GetReadRepository<ExpenseReport>().FindByCondition(x => x.Id.Equals(ExpenseReportId)).FirstOrDefaultAsync().ConfigureAwait(false);
            expenseReprot.TotalValue = totalValue - expenseReprot.AdvanceValue;
            _uow.GetWriteRepository<ExpenseReport>().Update(expenseReprot);
            await _uow.CommitAsync();

        }

这个方法中一个重要的细节是_uow.GetReadRepository <ExpenseReport> ()我已经在使用 AsNoTracking 来不映射它

这些是获取和更新的方法"repository dynamic"

  public void Update(T entity)
        {
            _dbSet.Update(entity);
        }

 public IQueryable<T> FindByCondition(Expression<Func<T, bool>> expression)
        {
            return _dbSet.Where(expression).AsNoTracking();
        }

你不需要打电话_dbSet.Update因为错误消息表明该实体已从您之前的查询中被跟踪。

尝试从语句中删除“AsNoTracking”FindByCondition方法并简单地在“Update”方法中调用 save :

public void Update(T entity)
{
    _dbContext.SaveChanges();
}

public IQueryable<T> FindByCondition(Expression<Func<T, bool>> expression)
{
    return _dbSet.Where(expression);
}

这是您可能想要重用的存储库模式的一个很好的通用实现:

public class GenericRepository<TEntity> : IRepository<TEntity> where TEntity : class
{
    /// <summary>
    /// The context object for the database
    /// </summary>
    private DbContext _context;

    /// <summary>
    /// The IObjectSet that represents the current entity.
    /// </summary>
    private DbSet<TEntity> _dbSet;

    /// <summary>
    /// Initializes a new instance of the GenericRepository class
    /// </summary>
    /// <param name="context">The Entity Framework ObjectContext</param>
    public GenericRepository(DbContext context)
    {
        _context = context;
        _dbSet = _context.Set<TEntity>();
    }

    /// <summary>
    /// Gets all records as an IQueryable
    /// </summary>
    /// <returns>An IQueryable object containing the results of the query</returns>
    public IQueryable<TEntity> GetQuery()
    {
        return _dbSet;
    }

    /// <summary>
    /// Gets all records as an IQueryable and disables entity tracking
    /// </summary>
    /// <returns>An IQueryable object containing the results of the query</returns>
    public IQueryable<TEntity> AsNoTracking()
    {
        return _dbSet.AsNoTracking<TEntity>();
    }

    /// <summary>
    /// Gets all records as an IEnumerable
    /// </summary>
    /// <returns>An IEnumerable object containing the results of the query</returns>
    public IEnumerable<TEntity> GetAll()
    {
        return GetQuery().AsEnumerable();
    }

    /// <summary>
    /// Finds a record with the specified criteria
    /// </summary>
    /// <param name="predicate">Criteria to match on</param>
    /// <returns>A collection containing the results of the query</returns>
    public IEnumerable<TEntity> Find(Expression<Func<TEntity, bool>> predicate)
    {
        return _dbSet.Where<TEntity>(predicate);
    }

    public Task<TEntity> FindAsync(params object[] keyValues)
    {
        return _dbSet.FindAsync(keyValues);
    }

    /// <summary>
    /// Gets a single record by the specified criteria (usually the unique identifier)
    /// </summary>
    /// <param name="predicate">Criteria to match on</param>
    /// <returns>A single record that matches the specified criteria</returns>
    public TEntity Single(Expression<Func<TEntity, bool>> predicate)
    {
        return _dbSet.Single<TEntity>(predicate);
    }

    /// <summary>
    /// The first record matching the specified criteria
    /// </summary>
    /// <param name="predicate">Criteria to match on</param>
    /// <returns>A single record containing the first record matching the specified criteria</returns>
    public TEntity First(Expression<Func<TEntity, bool>> predicate)
    {
        return _dbSet.First<TEntity>(predicate);
    }

    /// <summary>
    /// The first record matching the specified criteria or null if not found
    /// </summary>
    /// <param name="predicate">Criteria to match on</param>
    /// <returns>A single record containing the first record matching the specified criteria or a null object if nothing was found</returns>
    public TEntity FirstOrDefault(Expression<Func<TEntity, bool>> predicate)
    {
        return _dbSet.FirstOrDefault<TEntity>(predicate);
    }

    /// <summary>
    /// Deletes the specified entitiy
    /// </summary>
    /// <param name="entity">Entity to delete</param>
    /// <exception cref="ArgumentNullException"> if <paramref name="entity"/> is null</exception>
    public void Delete(TEntity entity)
    {
        if (entity == null)
        {
            throw new ArgumentNullException("entity");
        }
        _dbSet.Remove(entity);
    }

    /// <summary>
    /// Adds the specified entity
    /// </summary>
    /// <param name="entity">Entity to add</param>
    /// <exception cref="ArgumentNullException"> if <paramref name="entity"/> is null</exception>
    public void Add(TEntity entity)
    {
        if (entity == null)
        {
            throw new ArgumentNullException("entity");
        }
        _dbSet.Add(entity);
    }


    /// <summary>
    /// Attaches the specified entity
    /// </summary>
    /// <param name="entity">Entity to attach</param>
    public void Attach(TEntity entity)
    {
        _dbSet.Attach(entity);
    }

    /// <summary>
    /// Detaches the specified entity
    /// </summary>
    /// <param name="entity">Entity to attach</param>
    public void Detach(TEntity entity)
    {
        _context.Entry(entity).State = EntityState.Detached;
    }

    public void MarkModified(TEntity entity)
    {
        _context.Entry(entity).State = EntityState.Modified;
    }

    public DbEntityEntry<TEntity> GetEntry(TEntity entity)
    {
        return _context.Entry(entity);
    }

    /// <summary>
    /// Saves all context changes
    /// </summary>
    public void SaveChanges()
    {
        _context.SaveChanges();
    }

    /// <summary>
    /// Releases all resources used by the WarrantManagement.DataExtract.Dal.ReportDataBase
    /// </summary>
    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }

    /// <summary>
    /// Releases all resources used by the WarrantManagement.DataExtract.Dal.ReportDataBase
    /// </summary>
    /// <param name="disposing">A boolean value indicating whether or not to dispose managed resources</param>
    protected virtual void Dispose(bool disposing)
    {
        if (disposing)
        {
            if (_context != null)
            {

                _context.Dispose();

                _context = null;

            }
        }
    }
}

这是界面:

public interface IRepository<TEntity> : IDisposable where TEntity : class
{
    IQueryable<TEntity> GetQuery();
    IEnumerable<TEntity> GetAll();
    IQueryable<TEntity> AsNoTracking();
    IEnumerable<TEntity> Find(Expression<Func<TEntity, bool>> predicate);
    TEntity Single(Expression<Func<TEntity, bool>> predicate);
    TEntity First(Expression<Func<TEntity, bool>> predicate);
    TEntity FirstOrDefault(Expression<Func<TEntity, bool>> predicate);
    void Add(TEntity entity);
    void Delete(TEntity entity);
    void Attach(TEntity entity);
    void Detach(TEntity entity);
    void MarkModified(TEntity entity);
    void SaveChanges();
}

请注意,如果实体没有被跟踪,您只需要调用“Attach”或“MarkModified”,在大多数情况下,您可以简单地进行查询,修改被跟踪实体的某些属性,然后调用SaveChanges.

您还可以将存储库与工作单元结合起来,这样您就可以更好地控制事务等......这是一个示例:

public class UnitOfWork : IUnitOfWork
{
    private readonly YouDatabaseContext _context = new YouDatabaseContext();
    private DbContextTransaction _dbContextTransaction;
    private GenericRepository<ExpenseReport> _expenseReportRepository;
    private GenericRepository<ExpenseItem> _expenseItemRepository;

    public GenericRepository<ExpenseReport> ExpenseReportRepository
    {
        get
        {
            if (_expenseReportRepository == null)
            {
                _expenseReportRepository = new GenericRepository<ExpenseReport>(_context);
            }
            return _expenseReportRepository;
        }

        set
        {
            _expenseReportRepository = value;
        }
    }
    
    public GenericRepository<ExpenseItem> ExpenseItemRepository
    {
        get
        {
            if (_expenseItemRepository == null)
            {
                _expenseItemRepository = new GenericRepository<ExpenseItem>(_context);
            }
            return _expenseItemRepository;
        }

        set
        {
            _expenseItemRepository = value;
        }
    }

    public void BeginTransaction()
    {
        _dbContextTransaction = _context.Database.BeginTransaction();
    }

    public void BeginTransaction(IsolationLevel isolationLevel)
    {
        _dbContextTransaction = _context.Database.BeginTransaction(isolationLevel);
    }

    public int Save()
    {
        return _context.SaveChanges();
    }

    public Task<int> SaveAsync()
    {
        return _context.SaveChangesAsync();
    }

    public void Commit()
    {
        if (_dbContextTransaction!=null)
        {
            _dbContextTransaction.Commit();
        }
    }

    public void RollBack()
    {
        if (_dbContextTransaction != null)
        {
            _dbContextTransaction.Rollback();
        }
    }

    private bool _disposed;

    protected virtual void Dispose(bool disposing)
    {
        if (!_disposed)
        {
            if (disposing)
            {
                _context.Dispose();
                _dbContextTransaction?.Dispose();
            }
        }
        _disposed = true;
    }

    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }
}

和界面:

public interface IUnitOfWork : IDisposable
{
    void BeginTransaction();
    void BeginTransaction(IsolationLevel isolationLevel);
    int Save();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无法跟踪实体类型 Model 的实例,因为已跟踪具有相同 {'Id'} 键值的另一个实例 的相关文章

  • 使用inotify监控文件

    我正在使用 inotify 来监视本地文件 例如使用 root temp inotify add watch fd root temp mask 删除该文件后 程序将被阻止read fd buf bufSize 功能 即使我创建一个新的 r
  • ASP.Net 使用状态服务器和缓存增加 MaxProcesses(网络花园)

    我在 IIS7 上有一个 ASP Net 网站 我计划增加 MaxProcesses 以匹配服务器上的核心数量 4 核心 64 位 Windows Server 2008 根据我的阅读 如果我增加 MaxProcesses 来创建一个网络花
  • 将 gcov 与 CMake/CDash 结合使用的详细指南?

    我在我的项目中使用 CMake 并设置了 cdash 服务器以进行连续 夜间构建 一切运行良好 通过设置 crontab 我们可以将每小时 每晚的构建 测试结果自动上传到我们的 cdash 服务器 我的下一步是将测试覆盖率报告添加到构建中
  • 如何在 asp .net mvc 2 中对不直接属于我的模型的对象使用 DisplayFor()?

    我确信我在这里遗漏了一些非常简单的东西 我创建了一个自定义日期时间显示模板 使用以下方法时效果很好 但是 我遇到了这样的情况 在部分控件内 我在 for 循环中迭代模型中的对象 我想要一个 DateTime 属性来使用显示模板 但我不知道如
  • string.empty 和 string[0] == '\0' 之间的区别

    假设我们有一个字符串 std string str some value is assigned 有什么区别str empty and str 0 0 C 11 及更高版本 string variable 0 如果字符串为空 则需要返回空字
  • 使用 microsoft word.interop 删除 Word 文档中的空白页

    我创建了一个Word文档 它使用以下命令生成动态内容词互操作 它有一些分页符之间使用 我面临的问题是 此分页符会创建我不想向用户显示的空白页面 在某些情况下 我需要在那里添加这些分页符以维护页面布局 因此我无法考虑删除这些分页符 但我想要的
  • 如何在单独的类库中管理客户端上下文对象?

    我正在尝试创建一个库 类库 对于共享点 它将拥有所有共享点 dll 来与共享点服务器交互上传文件 文档并创建文档库和文档集 现在这个库可以被使用客户端 例如 Web 应用程序 asp net webform 或 mvc 或控制台应用程序或
  • 为什么long long 2147483647 + 1 = -2147483648? [复制]

    这个问题在这里已经有答案了 为什么这段代码不打印相同的数字 long long a b a 2147483647 1 b 2147483648 printf lld n a printf lld n b 我知道int变量的最大数量是2147
  • T-SQL:检查电子邮件格式

    我有这样的场景 我需要物理数据库中的数据完整性 例如 我有一个变量 email address VARCHAR 200 我想检查一下值是否为 email address是电子邮件格式 有人知道如何检查 T SQL 中的格式吗 非常感谢 我使
  • C#中如何将委托转换为对象?

    我正在使用反射类来调用其他 dll 上的一些方法 方法的参数之一是委托类型 我想通过使用反射来调用这个方法 所以我需要将函数参数作为对象数组传递 但我找不到任何关于 如何将委托转换为对象 提前致谢 委托是一个对象 只需像平常一样创建预期的委
  • 那里有更好的 DateTime.Parse 吗? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有谁知道有一个库 付费或免费 能够处理比 DateTime Parse 使用的更常见的日期时间格式 能够
  • 在 C# 4.0 中,是否可以从泛型类型参数派生类?

    我一直在尝试这个 但我似乎无法弄清楚 我想做这个 public abstract class SingletonType
  • C++ 静态工厂构造函数

    我正在进行模拟 它需要创建多个相当相似的模型 我的想法是有一个名为 Model 的类并使用静态工厂方法来构造模型 例如 模型 createTriangle or 模型 createFromFile 我从以前的 java 代码中汲取了这个想法
  • System.Drawing.Icon 构造函数抛出“操作成功完成”异常

    在 Windows XP 计算机上 以下代码抛出 System ComponentModel Win32Exception 并显示消息 操作成功完成 System Drawing Icon icon new System Drawing I
  • 第一个随机数始终小于其余随机数

    我碰巧注意到 在 C 中 使用 std rand 方法调用的第一个随机数大多数时候都明显小于第二个随机数 关于 Qt 实现 第一个几乎总是小几个数量级 qsrand QTime currentTime msec qDebug lt lt q
  • asp.net MVC ModelState.IsValid 返回 false

    我正在开发 ASP NET MVC 应用程序 我有一个视图模型如下 public class SampleInterestViewModel Properties defined One such property that shows a
  • 更改预处理到文件后出现错误 1 ​​错误 LNK1104

    我必须使用预处理器 所以我改变了 配置属性 gt C gt 预处理器 gt 预处理为文件 gt 是 并得到错误 错误 1 错误 LNK1104 无法打开文件 Debug asnreal obj 这个问题的解决办法 我必须在 lib 文件的路
  • 访问 Visual Studio 扩展中的当前代码窗格

    我正在编写一个 Visual Studio 2010 扩展 在代码视图中带有右键单击菜单 我希望能够从菜单项事件处理程序检查当前代码 但无法在对象模型中找到执行此操作的位置 如何在 Visual Studio 扩展中访问当前窗口中的代码 E
  • MsBuild 在 Visual Studio Online 上找不到恢复的 NuGet 包

    我尝试构建一个存储在 Visual Studio Online 上的外部 GIT 存储库中的解决方案 它有以下步骤 1 Git 恢复 有效 2 NuGet 恢复 有效 3 构建 不起作用 查看日志时我的第一个猜测是 MsBuild 没有查找
  • AddressAccessDeniedException :无需 netsh 即可解决它?

    我遇到了异常AddressAccessDeniedException因为我的processus没有注册URL的权限 我首先以管理员身份运行我的程序 好的 它成功了 但我现在想要分发我的应用程序 并且我希望每个用户都能够运行它 而不必成为管理

随机推荐

  • 如何将Zxing库包含到android项目中?

    我在 stackoverflow 上读过这个问题的一些答案 但它对我不起作用 我已经有一个项目 现在我想将二维码和条形码阅读器集成到我的项目中 我从以下位置下载了 zip 文件 core 2 2 zip https code google
  • Spring安全策略MODE_INHERITABLETHREADLOCAL。为什么?

    我了解当我们在 Spring 安全策略中使用 MODE THREADLOCAL 和 MODE INHERITABLETHREADLOCAL 时如何以及会发生什么 我不明白的是 为什么有人会使用 MODE THREADLOCAL 而不是 MO
  • 使用互操作引发 vb6 事件

    我有一个旧版 VB6 组件 已使用 tlbimp exe 将其导入到 VS 中以生成互操作程序集 VB6 组件定义了一个事件 允许我在 VB6 中传递消息 Public Event Message ByVal iMsg As Variant
  • 如何使用 moq 框架在 C# 中编写私有方法的单元测试?

    我想使用 moq 框架在 C 中为私有方法编写单元测试 我在 StackOverFlow 和 Google 中进行了搜索 但找不到预期的结果 如果可以 请你帮助我 你不能 至少对于 Moq 来说不能 但更重要的是 你不应该 首先 你不测试m
  • 无法访问 Live Server 中的 codeigniter 控制器,但可以在 localhost 中访问(Windows 上的 xampp)

    我的项目在本地系统 XAMPP 上运行良好 但是当上传到托管服务器时它不起作用 我正在使用 Codeigniter 框架 可通过 localhost myproject controller 在本地主机中访问 但在主机服务器中无法通过 my
  • 我如何知道 Log4j 从哪里选择其配置

    有没有办法找出 Log4J 从哪里选择配置文件 我尝试更改 log4j xml 但更改未反映在 Log4j 行为中 我删除了 log4j xml 有趣的是 Log4J 仍在使用旧的行为 所以它必须选择我的命名空间中可用的一些配置文件 但问题
  • R中如何判断数字是否连续?

    我有一系列的价值观 c 1 2 3 4 5 8 9 10 13 14 15 我想找到数字变得不连续的范围 我想要的只是作为输出 1 5 8 10 13 15 我需要找到断点 我需要用 R 来做 像这样的东西吗 x lt c 1 5 8 10
  • HTML 注入时使用 CDN 或外部域的内联脚本后执行脚本文件

    我在将 HTML 注入已加载的 DOM 时遇到问题 其中在下载脚本文件后加载内联 javascript 据我所知 这不应该是异步的 内联脚本应该在脚本文件之后执行 如果域名与调用页面相同 则此方法有效 但使用 CDN 甚至子域可以实现相同的
  • 如何从数据库创建Codeigniter语言文件?

    我正在使用 Codeigniter 构建一个多语言在线网站 我的问题是如何将数据从数据库传递到 Codeigniter 语言文件 到目前为止我的逻辑是运行foreach查询 它将使用 Translation key 和 value 填充语言
  • 表单随机提交为 GET 而不是 POST

    这有点疯狂 这是我们的表格OpenID 提供商 https blog stackoverflow com 2011 05 stack exchange is an openid provider
  • Ehcache复制缓存启动时不同步

    我有一个跨两台机器复制的 ehcache 缓存 一旦两个对等点启动 对等点就会正确地找到彼此并进行复制 但是 如果第一个对等点首先启动并接收多个元素 然后第二个对等点稍后启动 第二个对等点永远不会看到在它尚未存在时添加的元素 具体顺序如下
  • 如何确认 TrueType PDF 字体缺少字形

    我有一个 PDF 它在 Acrobat 中渲染良好 但在打印机 RIP 上的 PDF 到 PS 转换过程中无法打印 用 pdftk 解压缩并编辑后 我发现如果我替换某种字体的使用 它将打印 该字体是一种奇怪的字体 是带有单个字符 空格 的
  • 正则表达式 - 从给定字符串中提取子字符串

    我这里有一根绳子 This is a string AAA123456789 所以这里的想法是提取字符串AAA123456789使用正则表达式 我正在将其与 X Path 合并 注 如果有相关帖子 请引导我查看 我认为 按理说 我应该sub
  • 如果我的套接字已连接且未关闭,为什么我要发送 RST?

    我有一个 Android 设备 它使用 java net Socket 与 PC 进行无线通信 一切都很好 但如果我在 1 分钟内什么都不做 即没有使用网络 那么当 Android 向 PC 发送数据包时 PC 会收到它并发送 ACK 但
  • IE11 是否有“Backface-visibility:hidden”替代方案?

    我正在尝试让卡片在 IE11 中看起来像在 Google Chrome 中一样 所以我正在寻找 翻转时正面图像不会显示在背面 翻转卡片背面后 背面的文字可见 但正面看不到 它在 IE 中也不起作用 该卡可在 Google Chrome 中使
  • 以编程方式使用自动布局约束

    我正在尝试以编程方式在我的 iOS 应用程序中使用自动布局 我有一个带有此初始化代码的简单视图控制器 UIView innerView UIView alloc initWithFrame self view bounds UIButton
  • 如何通过通话听筒扬声器播放AVSpeechSynthesizer?

    我喜欢通过呼叫接收器扬声器播放音频 目前我正在使用它来播放一些文本作为音频 AVSpeechUtterance utterance AVSpeechUtterance speechUtteranceWithString strTextChe
  • Android L SoundPool.load() 回归

    在 Android L 最新的开发者预览版 Nexus 5 上 SoundPool load 方法似乎存在回归 需要 gt 5 秒才能加载样本 我尝试了 OGG 或 MP3 结果相同 尝试了不同的大小 但都在 100kb 以下 看来40kb
  • 如何在既没有 CORS 也没有 JSONP 的来源的网页上使用 JSON? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 无法跟踪实体类型 Model 的实例,因为已跟踪具有相同 {'Id'} 键值的另一个实例

    我有一个问题 我什么时候会更新我的数据库 我有这个异常 无法跟踪实体类型 ExpenseReport 的实例 因为 另一个具有相同键值 Id 的实例已被使用 被跟踪 附加现有实体时 确保只有一个实体 附加具有给定键值的实例 考虑使用 DbC