@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;
}

Но я должен признать, что я только догадываюсь относительно того, что они действительно делают (я нашел их только через просмотр исходного кода), и они, похоже, не оказывают никакого влияния в любом случае.

Любая помощь будет принята с благодарностью. Если вам нужна дополнительная информация / код, пожалуйста, дайте мне знать.

Ответы на вопрос(1)

Ваш ответ на вопрос