我有點難住。從我讀過的將DbContext.AutoDetectChangesEnabled設置爲false應禁用更改跟蹤,需要調用DbContext.DetectChanges以識別要發送到數據庫的更改。DbContext AutoDetectChangesEnabled設置爲false檢測更改
但是,從下面的日誌中可以清楚看到,即使設置爲false,更改仍由dbContexts更改跟蹤器註冊。
我錯過了什麼嗎?
實體框架版本:5.0.0.0
的DbContext類
public class ProjectContext : DbContext {
public DbSet<Project> Projects {get;set;}
}
Controller類
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();
}
記錄方法
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);
}
}
}
}
首先登錄
***Entity Name: Models.Projectis in a state of Added
***CurrentValues***
ProjectId:0
ProjectName:uniqueName
第二登錄
***Entity Name: Models.Projectis in a state of Modified
***CurrentValues***
ProjectId:1
ProjectName:uniqueName
***Original Values***
ProjectId:1
ProjectName:a differentName!
我有幾次讀一遍,但是這並幫助回答我問題相當多,謝謝!抱歉關於複製和粘貼錯誤;我會更新後代的問題。 – Jesse
不幸的是,「在循環中批量添加實體」是您希望禁用更改跟蹤的時候。這是一個_massive_加速(樣本大小爲1,在我的應用程序中進行了測試,但它是添加~3000行的兩次運行之間的唯一區別)。 –
@EdS .:批量添加是「最簡單的事情」之一,我的意思是我實際上會*禁用自動更改檢測。 – Slauma