Как мне отключить отслеживание изменений на уровне DbContext в EF 4.1 RC?

Я столкнулся с обычной проблемой: я обновляю значения в моя база данных, но 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;
}

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

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

7
задан Ladislav Mrnka 31 March 2011 в 16:13
поделиться