【问题标题】:Why can't I access the update method in dbset? [closed]为什么我无法访问 dbset 中的更新方法? [关闭]
【发布时间】:2020-09-04 11:49:13
【问题描述】:

我正在为我的存储库创建一个类来继承。我放了一些常用的方法,其中之一,Update。

但是我有这个错误DbSet does not contain a definition for Update

public abstract class AggregateRepository<TEntity> : IAggregateRepository<TEntity> where TEntity : AggregateEntity, new ()
    {
        protected readonly MyDbContext DbContext;
        protected readonly DbSet<TEntity> DbSet;

        protected AggregateRepository(MyDbContext dbContext)
        {
            DbContext = dbContext;
            DbSet = dbContext.Set<TEntity>();
        }

        public virtual async Task Update(TEntity entity)
        {
            DbSet.Update(entity); //ERROR
        }
}

如果没有更新条目,我应该如何更新数据库中的实体?

【问题讨论】:

  • 您只需更改其属性的值,最后调用SubmitChanges()。每个实体都在后台进行跟踪,因此系统将知道它必须在哪一部分数据上调用更新
  • 所以,在这个聚合中,我做不到。我说的对吗?
  • 或者我必须用这个通用实体调用 Add 吗?
  • “如何更新实体”的问题太宽泛了。这取决于您的工作方式(连接/断开连接)和各种偏好。
  • @MongZhu 我的错。我要更新,而不是插入。

标签: c# .net entity-framework asp.net-core


【解决方案1】:

如果实体正在被上下文跟踪(即要更新的实体是在更新之前从上下文中获取的,并且没有使用 AsNoTracking()),那么更新是一个简单的DbContext.SaveChangesAsync调用

public virtual async Task Update(TEntity entity)
{
    // In case entity is being tracked.
    if (entity == null) throw new ArgumentNullException("entity");
    return DbContext.SaveChangesAsync();
}

否则您需要先跟踪实体,然后保存更改。

public virtual async Task TrackAndUpdate(TEntity entity)
{
    // In case AsNoTracking is used while retrieving entity or entity is not tracked.
    Context.Entry(entity).State = EntityState.Modified;
    return DbContext.SaveChangesAsync();
}

根据需求,可以调用适当的方法来更新实体。

【讨论】:

  • 这是一个非常有限的答案,甚至是不正确的。第一种方法在上下文中保存 所有 更改,而不仅仅是方法签名中所期望的实体(使用 EF 是不可能的)。第二种方法忽略嵌套实体,因此可能导致异常甚至不正确的数据库内容。
  • 您好,请您提供一些示例或相关文档。我们在我们的一个组件中实现了该实现,我非常有兴趣在它造成任何严重问题之前对其进行修复。此外,该组件已经运行了很长一段时间,没有任何问题。
  • 这是一个非常广泛的主题,例如,请参阅this。这就是为什么这个问题(“我应该如何更新数据库中的实体?”)因为过于宽泛而被关闭。您需要了解所有参数才能找到合适的解决方案。在你的情况下有效的方法对其他人来说可能是不够的。
  • 感谢您的文章。我去看看。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-19
  • 2012-05-20
  • 1970-01-01
  • 1970-01-01
  • 2013-01-10
相关资源
最近更新 更多