C# 当数据库EF Core中已保存此实体时,如何删除DBContext中的条目

C# 当数据库EF Core中已保存此实体时,如何删除DBContext中的条目,c#,entity-framework,entity,state,savechanges,C#,Entity Framework,Entity,State,Savechanges,我面临dbcontext条目的问题 我有2个实体保存到数据库与EF核心。 实体 实体B EntityA已保存到数据库,但EntityB未保存 当我调用我的代码来保存更改EntityA时,对于键“PRIMARY”,我有一个错误重复条目“7c4e4552-c46f-4153-b1e8-c9ebfca135a4”,正常,然后我想保存EntityB,但当我调用我的保存更改时,我看到我的DBContext条目集合中有2个条目,我无法保存EntityB,因为EF再次尝试保存EntityA public as

我面临dbcontext条目的问题

我有2个实体保存到数据库与EF核心。 实体 实体B

EntityA已保存到数据库,但EntityB未保存

当我调用我的代码来保存更改EntityA时,对于键“PRIMARY”,我有一个错误重复条目“7c4e4552-c46f-4153-b1e8-c9ebfca135a4”,正常,然后我想保存EntityB,但当我调用我的保存更改时,我看到我的DBContext条目集合中有2个条目,我无法保存EntityB,因为EF再次尝试保存EntityA

public async Task<TEntity> AddAsync(TEntity entity)
{
    if (entity == null)
    {
        throw new ArgumentNullException($"{nameof(AddAsync)} entity must not be null");
    }

    try
    {
        await Context.AddAsync(entity);
        await Context.SaveChangesAsync();
        return entity;
    }

    catch (Exception ex)
    {
        throw new Exception($"{nameof(entity)} could not be saved. {errorMessage}");
    }
}


public override async Task<int> SaveChangesAsync(CancellationToken cancellationToken = default(CancellationToken))
        {
            // Get all the entities that inherit from AuditableEntity
            // and have a state of Added or Modified
            var entries = ChangeTracker
                .Entries()
                .Where(e => e.Entity is AuditableEntity && (
                        e.State == EntityState.Added
                        || e.State == EntityState.Modified));

            // For each entity we will set the Audit properties
            foreach (var entityEntry in entries) ***//Here are 2 when I only want 1***
            {
                // If the entity state is Added let's set
                // the CreatedAt and CreatedBy properties
                if (entityEntry.State == EntityState.Added)
                {
                    ((AuditableEntity)entityEntry.Entity).CreatedAt = DateTime.UtcNow;
                    ((AuditableEntity)entityEntry.Entity).CreatedBy = _httpContextAccessor?.HttpContext?.User?.Identity?.Name ?? MyApp;
                }
                else
                {
                    // If the state is Modified then we don't want
                    // to modify the CreatedAt and CreatedBy properties
                    // so we set their state as IsModified to false
                    Entry((AuditableEntity)entityEntry.Entity).Property(p => p.CreatedAt).IsModified = false;
                    Entry((AuditableEntity)entityEntry.Entity).Property(p => p.CreatedBy).IsModified = false;
                }

                // In any case we always want to set the properties
                // ModifiedAt and ModifiedBy
                ((AuditableEntity)entityEntry.Entity).ModifiedAt = DateTime.UtcNow;
                ((AuditableEntity)entityEntry.Entity).ModifiedBy = _httpContextAccessor?.HttpContext?.User?.Identity?.Name ?? MyApp;
            }

            // After we set all the needed properties
            // we call the base implementation of SaveChangesAsync
            // to actually save our entities in the database
            return await base.SaveChangesAsync(cancellationToken);
        }
public async Task AddAsync(tenty实体)
{
if(实体==null)
{
抛出新ArgumentNullException($“{nameof(AddAsync)}实体不能为null”);
}
尝试
{
wait Context.AddAsync(实体);
wait Context.saveChangesSync();
返回实体;
}
捕获(例外情况除外)
{
抛出新异常($“{nameof(entity)}无法保存。{errorMessage}”);
}
}
公共覆盖异步任务saveChangesSync(CancellationToken CancellationToken=default(CancellationToken))
{
//获取从AuditableEntity继承的所有实体
//并具有添加或修改的状态
var条目=ChangeTracker
.条目()
其中(e=>e.实体为可审计实体&&(
e、 State==EntityState.Added
||e.State==EntityState.Modified));
//对于每个实体,我们将设置审计属性
foreach(entries中的var entityEntry)***//当我只想要1时,这里有2个***
{
//如果添加了实体状态,则设置
//CreatedAt和CreatedBy属性
if(entityEntry.State==EntityState.Added)
{
((AuditableEntity)entityEntry.Entity).CreatedAt=DateTime.UtcNow;
((AuditableEntity)entityEntry.Entity).CreatedBy=\u httpContextAccessor?.HttpContext?.User?.Identity?.Name??MyApp;
}
其他的
{
//如果状态被修改,那么我们不希望
//修改CreatedAt和CreatedBy属性的步骤
//所以我们将它们的状态设置为IsModified为false
Entry((AuditableEntity)entityEntry.Entity).Property(p=>p.CreatedAt).IsModified=false;
Entry((AuditableEntity)entityEntry.Entity).Property(p=>p.CreatedBy).IsModified=false;
}
//在任何情况下,我们都希望设置属性
//ModifiedAt和ModifiedBy
((AuditableEntity)entityEntry.Entity).ModifiedAt=DateTime.UtcNow;
((AuditableEntity)entityEntry.Entity).ModifiedBy=\u httpContextAccessor?.HttpContext?.User?.Identity?.Name??MyApp;
}
//在我们设置了所有需要的属性之后
//我们称之为SaveChangesAsync的基本实现
//在数据库中实际保存实体
返回wait base.saveChangesSync(cancellationToken);
}

您是否在项目中启用了代码迁移

如果没有,则会看到此错误,因为EF正在尝试再次创建EntityA,因为您尚未启用代码迁移。代码迁移将增量更新数据,以使其与应用程序的数据模型保持同步,同时保留数据库中的现有数据。
请参阅下面的链接以添加迁移。

谢谢Lenka,我将重新检查我的迁移。我会给出反馈。继续讨论同样的问题。我将在添加到数据库之前检查实体是否已经存在,然后我将管理它。如果存在,我将其发送到更新,如果不存在,我将其保存。您提到了主键的重复输入错误,如果保存数据中存在重复值,则会发生这种情况。哪个EF版本?