我遇到了一个似乎常见的问题:我正在更新数据库中的值,但EF正在使用其原始的内存副本,并且这些更改的值不会反映在显示的数据中.我理解为什么会这样,但我无法找到解决方法.
最常见的解决方案似乎是设置MergeOptions.NoTracking
完全关闭更改跟踪(或AsNoTracking()
在查询时使用扩展方法)并在每次访问对象时强制刷新,这对我来说很好.
我有一个通用的基础存储库,我的其他存储库继承自:
public abstract class RepositoryBase<T> where T : class
{
private readonly IDbSet<T> _dbset;
private readonly IUnitOfWork _unitOfWork;
protected RepositoryBase(IUnitOfWork unitOfWork)
{
_unitOfWork = unitOfWork;
_dbset = _unitOfWork.Database.Set<T>();
}
public virtual IQueryable<T> All()
{
return _dbset;
}
// Some other IQueryable methods here (Query, GetByProductCode etc)
public virtual T Get(long id)
{
return _dbset.Find(id);
}
}
Run Code Online (Sandbox Code Playgroud)
和DbContext
这样的:
public class Db : DbContext
{
private IDbSet<Product> _products;
public IDbSet<Product> Products
{
get { …
Run Code Online (Sandbox Code Playgroud) c# entity-framework change-tracking ef-code-first entity-framework-4.1
我对实体框架中DbContext的使用有点困惑.这是我很困惑的情景.
我使用dbcontext中的linq查询来获取数据.就像是:
List<Transactions> transactions = DefaultContext.Transactions.ToList();
Run Code Online (Sandbox Code Playgroud)然后我直接在数据库中更新该查询中返回的一个事务中的列.
然后我再打电话:
List<Transactions> transactions = DefaultContext.Transactions.ToList();
Run Code Online (Sandbox Code Playgroud)当列表返回这次时,它不反映我在运行update语句时所做的更新/更改,除非我遍历所有事务并重新加载它们:
foreach (DbEntityEntry<Transactions> item in DefaultContext.ChangeTracker.Entries<Transactions>())
{
DefaultContext.Entry<Transactions>(item.Entity).Reload();
}
Run Code Online (Sandbox Code Playgroud)
这是正常的行为吗?我假设在我的初始查询中,它们被附加到对象上下文.然后当我第二次查询时,它不会访问数据库,只是从对象上下文中提取实体,除非我清除/分离或单独重新加载所有实体.
c# entity-framework .net-4.0 visual-studio-2010 entity-framework-4.1