简体   繁体   English

InvalidOperationException:无法跟踪实体实例 - EF Core

[英]InvalidOperationException: The instance of entity cannot be tracked - EF Core

I am attempting to save date in multiple tables with a one-to-many relationship in using EF Core. 我试图在使用EF Core的多个表中保存日期与一对多的关系。 When I do, I get this error: 当我这样做时,我收到此错误:

InvalidOperationException: The instance of entity type 'OrganizationGroupEntity' cannot be tracked because another instance with the same key value for {'Id'} is already being tracked. InvalidOperationException:无法跟踪实体类型“OrganizationGroupEntity”的实例,因为已经跟踪了另一个具有{'Id'}键值的实例。 When attaching existing entities, ensure that only one entity instance with a given key value is attached. 附加现有实体时,请确保仅附加具有给定键值的一个实体实例。 Consider using 'DbContextOptionsBuilder.EnableSensitiveDataLogging' to see the conflicting key values. 考虑使用'DbContextOptionsBuilder.EnableSensitiveDataLogging'来查看冲突的键值。

Here is my code: 这是我的代码:

Request model: 请求型号:

public class Organization
{
    public Organization()
    { }

    public Organization(OrganizationEntity organizationEntity, List<OrganizationGroupEntity> organizationGroupEntities)
    {
        Id = organizationEntity.Id;
        Name = organizationEntity.Name;
        Groups = ToList(organizationGroupEntities);
    }

    public int Id { get; set; }
    public string Name { get; set; }}
    public List<OrganizationGroup> Groups { get; set; }

    private List<OrganizationGroup> ToList(List<OrganizationGroupEntity> organizationGroupEntities)
    {
        return organizationGroupEntities.Select(
                entity => new OrganizationGroup(entity)
            ).ToList();
    }
}

public class OrganizationGroup
{
    public OrganizationGroup()
    { }

    public OrganizationGroup (OrganizationGroupEntity entity)
    {
        Id = entity.Id;
        Group = entity.Group;
    }

    public int Id { get; set; }
    public string Group { get; set; }
}

Entity models: 实体模型:

public class OrganizationEntity
{
    public OrganizationEntity()
    { }

    public OrganizationEntity(Organization model)
    {
        Id = model.Id;
        Name = model.Name;
    }

    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }
    public string Name { get; set; }
}

public class OrganizationGroupEntity
{
    public OrganizationGroupEntity()
    { }

    public OrganizationGroupEntity(int organizationId, OrganizationGroup model)
    {
        Id = model.Id;
        OrganizationId = organizationId;
        Group = model.Group;
    }

    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }
    public int OrganizationId { get; set; }
    public string Group { get; set; }
}

dbContext: 的DbContext:

public DbSet<OrganizationEntity> Organizations { get; set; }
public DbSet<OrganizationGroupEntity> OrganizationGroups { get; set; }

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder);

    modelBuilder.Entity<OrganizationEntity>()
        .ToTable("Organizations", "dbo");

    modelBuilder.Entity<OrganizationGroupEntity>()
        .ToTable("OrganizationGroups", "dbo");
}

repository: 库:

public async Task<Organization> UpdateOrganization(Organization request)
{
    // Get the org entity
    var organizationEntity = new OrganizationEntity(request);

    // get the org groups entities
    var groupEntities = request.Groups
        .Select(
            group => new OrganizationGroupEntity(request.Id, group)
        ).ToList();

    // Get the group entities to remove
    var oldEntities = GetOrganizationGroups(request.Id);
    var entitiesToRemove = new List<OrganizationGroupEntity>();
    foreach (var oldEntity in oldEntities.Result)
    {
        if (!groupEntities.Any(e => e.Id == oldEntity.Id))
        {
            entitiesToRemove.Add(oldEntity);
        }
    }

    using (var transaction = _context.Database.BeginTransaction())
    {
        _context.Organizations.Update(organizationEntity);
        _context.OrganizationGroups.UpdateRange(groupEntities);        // <-- Fails here
        _context.OrganizationGroups.RemoveRange(entitiesToRemove);
        await _context.SaveChangesAsync();
        transaction.Commit();
    }

    return request;
}

private async Task<IEnumerable<OrganizationGroupEntity>> GetOrganizationGroups(int organizationId)
{
    return await _context.OrganizationGroups
        .Where(e => e.OrganizationId == organizationId)
        .OrderBy(e => e.Order)
        .ToListAsync();
}

It turns out when I was getting the current groupEntities in order to fins out what to remove I was initiating tracking on that table. 事实证明,当我获得当前的groupEntities ,为了groupEntities要删除的内容我正在该桌面上启动跟踪。 Adding AsNoTracking() to GetOrganizationGroups solved my issue. AsNoTracking()添加到GetOrganizationGroups解决了我的问题。 Like so: 像这样:

private async Task<IEnumerable<OrganizationGroupEntity>> GetOrganizationGroups(int organizationId)
{
    return await _context.OrganizationGroups
        .AsNoTracking()
        .Where(e => e.OrganizationId == organizationId)
        .OrderBy(e => e.Order)
       .ToListAsync();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 InvalidOperationException:无法跟踪实体类型&#39;ApplicationUser&#39;的实例 - InvalidOperationException: The instance of entity type 'ApplicationUser' cannot be tracked EF Core:无法跟踪实体类型的实例,并且无法注入上下文依赖项 - EF Core: The instance of entity type cannot be tracked and context dependency injection Asp.net 核心System.InvalidOperationException: 无法追踪实体类型x的实例 - Asp.net core System.InvalidOperationException: The instance of entity type x cannot be tracked InvalidOperationException:无法跟踪实体类型“Vessels”&gt; 的实例,因为另一个实例 - InvalidOperationException: The instance of entity type 'Vessels' > cannot be tracked because another instance 无法跟踪实体类型的实例,因为另一个实例...更新数据库时出现 EF Core 错误 - The instance of entity type cannot be tracked because another instance… EF Core error when updating db EF Core:无法跟踪实体类型的实例,因为另一个实例具有相同的键值 - EF Core: The instance of entity type cannot be tracked because another instance with the same key value EF Core(内存数据库)-'无法跟踪实体类型 X 的实例,因为另一个具有键值的实例 - EF Core (in-memory database) - 'The instance of entity type X cannot be tracked because another instance with the key value EF Core:无法跟踪实体类型 [EntityType] 的实例,因为已跟踪具有键值 {EntityId: X} 的另一个实例 - EF Core: the instance of entity type [EntityType] cannot be tracked because another instance with the key value{EntityId: X} is already being tracked 带有 Automapper 的 EF Core 抛出异常“无法跟踪实体类型” - EF Core with Automapper throw Exception 'Entity type cannot be tracked' EF:无法跟踪实体类型X的实例,因为已经跟踪了具有相同密钥的此类型的另一个实例 - EF: The instance of entity type X cannot be tracked because another instance of this type with the same key is already being tracked
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM