Wie kann ich deaktivieren Sie die änderungsnachverfolgung in der DbContext-Ebene in EF 4.1 RC?

Ich habe festgestellt, was scheint ein häufiges problem zu sein: ich bin eine Aktualisierung der Werte in meiner Datenbank, aber EF ist mit Ihrem ursprünglichen in-memory-Kopie des Objekts, und diese geänderten Werte werden nicht wiedergegeben, in der Sie die angezeigten Daten. Ich verstehe, warum das so ist, aber ich kann nicht herausfinden, einen Weg, um es.

Die gängigste Lösung zu sein scheint, legen Sie MergeOptions.NoTracking um die änderungsprotokollierung deaktivieren, vollständig (oder verwenden Sie die AsNoTracking() Erweiterung Methode beim Abfragen) und eine Aktualisierung erzwingen, jedes mal auf das Objekt zugegriffen wird, das ist in Ordnung für meine Zwecke.

Habe ich eine generische base-repository, welches mein anderen repositories Erben von:

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

Und ein DbContext wie diese:

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();
    }
}

Wenn ich die All() Methode meiner repository also:

public virtual IQueryable<T> All()
{
    return _dbset.AsNoTracking();
}

Bekomme ich das gewünschte Ergebnis - ein update in die Datenbank übernommen und wenn die Seite mit den Produkten aktualisiert wird. Aber ich kann dies nicht in der Get() Methode, wie die Methode funktioniert nur auf einem IQueryable.

Idealerweise möchte ich dies ausschalten an der DbContext Ebene, wie ich, nie ändern müssen verfolgen, aber es scheint nicht, eine offensichtliche Weg, dies zu tun, und es ist ziemlich viel null Dokumentation zu dem Thema (es sei denn, jemand kann mir einige? Bitte!!!).

Habe ich versucht, indem Sie einen Konstruktor für die DbContext mit diesen Konfigurations-Optionen deaktiviert sind:

public Db()
{
    base.Configuration.ProxyCreationEnabled = false;
    base.Configuration.AutoDetectChangesEnabled = false;
}

Aber ich muss zugeben, ich bin nur zu erraten, was Sie wirklich tun (ich habe nur diese gefunden, durch das suchen an der Quelle-code), und Sie scheinen nicht zu haben einen Effekt sowieso.

Jegliche Hilfe würde sehr geschätzt werden. Wenn weitere Infos/code würde helfen, lassen Sie es mich bitte wissen.

InformationsquelleAutor Mark Bell | 2011-03-31
Schreibe einen Kommentar