Ich bin ein wenig ratlos. Von dem, was ich gelesen habe, sollte das Setzen von DbContext.AutoDetectChangesEnabled auf false die Änderungsverfolgung deaktivieren, die DbContext.DetectChanges aufrufen muss, um Änderungen zu identifizieren, die an die Datenbank gesendet werden sollen.DbContext AutoDetectChangesEnabled auf falsche Erkennung von Änderungen gesetzt
Es ist jedoch klar, meine Protokolle unten, dass die Änderungen von dbContexts registriert werden Tracker ändern, auch mit der Einstellung auf false gesetzt.
Fehle ich etwas?
Entity Framework Version: 5.0.0.0
DbContext Klasse
public class ProjectContext : DbContext {
public DbSet<Project> Projects {get;set;}
}
Controller-Klasse
private ProjectContext db = new ProjectContext();
public method(){
Project p = new Project("uniqueName");
db.Configuration.AutoDetectChangesEnabled = false;
db.Projects.Add(p);
DebugChangeTracker();
db.SaveChanges();
db.Projects.First().ProjectName = "a differentName!";
DebugChangeTracker();
db.SaveChanges();
}
Logging Methode
private void DebugChangeTracker()
{
var path = "C:\\mypath\\";
path = path + Util.GetMsSinceEpoch().ToString() + "changeTracker.log";
using (StreamWriter sw = new StreamWriter(path))
{
var changeTracker = db.ChangeTracker;
var entries = changeTracker.Entries();
foreach (var x in entries)
{
var name = x.Entity.ToString();
var state = x.State;
sw.WriteLine("");
sw.WriteLine("***Entity Name: " + name +
"is in a state of " + state);
var currentValues = x.CurrentValues;
sw.WriteLine("***CurrentValues***");
PrintPropertyValues(currentValues,sw);
if (state != EntityState.Added)
{
sw.WriteLine("***Original Values***");
PrintPropertyValues(x.OriginalValues,sw);
}
}
}
}
Erste log
***Entity Name: Models.Projectis in a state of Added
***CurrentValues***
ProjectId:0
ProjectName:uniqueName
Second Log
***Entity Name: Models.Projectis in a state of Modified
***CurrentValues***
ProjectId:1
ProjectName:uniqueName
***Original Values***
ProjectId:1
ProjectName:a differentName!
Ich hatte zu lesen über das ein paar Mal, aber das nicht beantworten helfen, meine Frage ziemlich viel, danke! Entschuldigung wegen des Kopier- und Einfügefehlers; Ich werde die Frage für die Nachwelt aktualisieren. – Jesse
Leider ist "bulk das Hinzufügen von Entitäten in einer Schleife", wenn die Änderungsverfolgung deaktiviert werden soll. Es ist eine _massive_ Beschleunigung (Stichprobenumfang von 1, getestet in meiner App, aber es war der einzige Unterschied zwischen zwei Läufen, die ~ 3000 Zeilen hinzufügten). –
@EdS .: Bulk-Hinzufügen ist eines der "einfachsten Dinge", die ich meinte, wo ich die automatische Änderungserkennung * deaktivieren * würde. – Slauma