@MarkBell Какое решение вы нашли? Я застрял с той же проблемой
лкнулся с общей проблемой: я обновляю значения в своей базе данных, но 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);
}
}
И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;
}
Но я должен признать, что я только догадываюсь относительно того, что они действительно делают (я нашел их только через просмотр исходного кода), и они, похоже, не оказывают никакого влияния в любом случае.
Любая помощь будет принята с благодарностью. Если вам нужна дополнительная информация / код, пожалуйста, дайте мне знать.