实体框架DbSet.Add(entity)生成相同的插入语句,尽管我在第二次尝试中提供了不同的值

时间:2019-03-05 18:39:05

标签: entity-framework

我正在以下情况下测试我的存储库类:

首先,我向

发出呼叫
Insert(TEntity entity)

已存在的实体。效果很好,EF给了我一个重复的键错误,很好。

之后,我重新发出对

的呼叫
Insert(TEntity entity)

但现在具有不同的数据;但是EF会生成与上一次调用相同的SQL语句。

public class EfRepository<TEntity> : IRepository<TEntity>
        where TEntity : Entity
{
    protected EcmsDbContext Context;
    internal DbSet<TEntity> DbSet;


    public EfRepository(EcmsDbContext context)
    {
        Context = context;
        DbSet = Context.Set<TEntity>();
    }

    public virtual async Task<bool> Insert(TEntity entity)
    {
        try
        {
            DbSet.Add(entity);
            return await Context.SaveChangesAsync() > 0;
        }
        catch (Exception e)
        {
            return false;
        }
    }
}

1 个答案:

答案 0 :(得分:1)

如果您尝试进行插入,则作为异常处理程序,如果您未处置DbContext或分离了最初添加的实体,则尝试使用新的调整后的实体发出插入,即“首先”实体仍将尝试保存。

我认为这应该有效:

try
{
    DbSet.Add(entity);
    return await Context.SaveChangesAsync() > 0;
}
catch (Exception e)
{
    Context.Entry(entity).State = EntityState.Detached;
    return false;
}