C# 插入/删除/插入导致跟踪错误

C# 插入/删除/插入导致跟踪错误,c#,entity-framework-core,C#,Entity Framework Core,我有一个使用EF Core 2.1的console.NET Core 2.1应用程序。它与数据库对话以读取和插入行。同时,其他应用程序也正在更新该数据库 我遇到的问题是,我从我的控制台应用程序创建了一行,然后外部应用程序删除了这一行,然后当我再次尝试插入具有相同主键的行时,我遇到以下异常- 无法跟踪实体类型“XYZ”的实例,因为已跟踪键值为“{ID:11,ABC:136,DEF:97}”的另一个实例。附着现有实体时,请确保仅附着一个具有给定键值的实体实例 下面是我的代码 var entity =

我有一个使用EF Core 2.1的console.NET Core 2.1应用程序。它与数据库对话以读取和插入行。同时,其他应用程序也正在更新该数据库

我遇到的问题是,我从我的控制台应用程序创建了一行,然后外部应用程序删除了这一行,然后当我再次尝试插入具有相同主键的行时,我遇到以下异常-

无法跟踪实体类型“XYZ”的实例,因为已跟踪键值为“{ID:11,ABC:136,DEF:97}”的另一个实例。附着现有实体时,请确保仅附着一个具有给定键值的实体实例

下面是我的代码

var entity = PopulateValuesFor(XYZ);

var existingXYZ = _Context.TABLE1
            .Include(r => r.TABLE2)
            .Include(r => r.TABLE3)
            .AsNoTracking()
            .FirstOrDefault(r => r.Id == 1234);                                 

        if (existingXYZ == null)
        {
            _Context.Add(entity);
        }
流程是

  • 上述代码称为-->行已插入
  • 外部应用程序从数据中删除该行
  • 再次调用上述代码-->异常

  • 如何告诉DbContext实体已不在数据库中。。。清除条目并再次将此行添加到数据库?因为它是一个控制台应用程序,所以只使用了DbContext的一个实例,它被注入到实现此方法的类中

    您似乎有一个长期的静态上下文。我建议将上述内容包装在using语句中,并使用短期上下文。这样,您的上下文就不会认为它已经插入了实体。

    我正在StartUp.cs类中创建services.AddDbContext的一个实例(是的,我在控制台应用程序中仍然有这个实例),以便注入它。如果我必须创建一个短暂的上下文,我将在哪里创建DbContext?围绕使用它的事务边界创建它。不是注入上下文,而是注入上下文工厂。长期使用上下文通常是个坏主意。我没有创建上下文工厂,只是在每次DB操作之前创建了一个新的上下文。这就解决了问题。此外,我还将DbContextOptionsBuilder选项生成器移动到上下文类中的OnConfigurang方法,并将其从启动时删除。这样,我就不必担心将上下文作为服务注入。请回答您的问题并包括一个示例。我们需要完整的代码来复制