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.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie erzwingen möchten, Kontext, um frische Daten zu jeder Zeit, die Sie nicht verwenden möchten
Find
Methode.Find
Methode immer die Abfrage zunächst in den internen Speicher. Verwenden Sie dieses anstatt:Aber ich verstehe nicht, was brauchen Sie diese? Was meinst du mit:
Kontext ist die Einheit der Arbeit. Es sollte verwendet werden, als Einheit von Arbeit - in der web-Anwendung oder web-service-es bedeutet die Schaffung einer neuen context-Instanz pro Anfrage. In winforms /wpf-Anwendung, die es bedeutet, mit Rahmen pro logischem block (pro presenter etc.). Deshalb sollten Sie diese nur in ganz bestimmten Szenarien, aber Sie wollen es weltweit. Ihre Beschreibung scheint, dass Sie die Wiederverwendung Zusammenhang zwischen Anforderungen, die ganz schlechte Lösung. Es gibt keine Leistung Kosten, die bei der Rekonstruktion Kontext für jede Anforderung.
InRequestScope()
bei der Injektion. Ich denke, dass ist jetzt eine eigene Frage, aber danke für deine Hilfe, immer diese weit.DbContext
Instanz pro Antrag eine factory-Klasse weiter unten in der app-stack. Es war sehr speziell für meinen code, der ist, warum ich nicht poste es hier. Im Grunde müssen Sie nur überprüfen, dass alles, was Ihnen IhreDbContext
Instanzen ist nicht das festhalten an diejenigen Instanzen, die zwischen Anforderungen,