Я столкнулся с обычной проблемой: я обновляю значения в моя база данных, но EF использует свою исходную копию объекта в памяти, и эти измененные значения не отражаются в отображаемых данных. Я понимаю, почему это так, но я не могу найти способ обойти это.
Наиболее распространенным решением, кажется, является установка MergeOptions. NoTracking
, чтобы полностью отключить отслеживание изменений (или использовать метод расширения AsNoTracking ()
при запросе) и принудительно обновлять каждый раз при обращении к объекту, что вполне подходит для моих целей.
I у меня есть общий базовый репозиторий, от которого наследуются другие мои репозитории:
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);
}
}
И DbContext
вроде этого:
public class Db : DbContext
{
private IDbSet<Product> _products;
public IDbSet<Product> Products
{
get { return _products ?? (_products = DbSet<Product>()); }
}
public virtual IDbSet<T> DbSet<T>() where T : class
{
return Set<T>();
}
public virtual void Commit()
{
base.SaveChanges();
}
}
Если я изменю метод All ()
своего репозитория таким образом :
public virtual IQueryable<T> All()
{
return _dbset.AsNoTracking();
}
Я получаю желаемый результат - обновление в базе данных отражается при обновлении страницы, отображающей товары. Однако я не могу сделать это в методе Get ()
, так как этот метод расширения работает только с IQueryable
.
В идеале я бы хотел отключить это на уровень DbContext
, поскольку мне никогда не понадобится отслеживание изменений, но здесь нет Это кажется очевидным способом сделать это, и документации по этому вопросу практически нет (если только кто-нибудь не укажет мне на что-нибудь? Пожалуйста!).
Я попытался добавить конструктор в DbContext
] с отключенными этими параметрами конфигурации:
public Db()
{
base.Configuration.ProxyCreationEnabled = false;
base.Configuration.AutoDetectChangesEnabled = false;
}
Но я должен признать, что только догадываюсь о том, что они на самом деле делают (я нашел их только при просмотре исходного кода), и, похоже, они все равно не имеют никакого эффекта.
Любая помощь будет принята с благодарностью. Если дополнительная информация / код помогут, дайте мне знать.