entity framework - DbContext AutoDetectChangesEnabled झूठे पता लगाने वाले परिवर्तनों के लिए सेट किया गया




entity-framework entity-framework-5 (2)

एंटिटी फ्रेमवर्क के अनुसार ऑटोमैटिक डिटेक्ट चेंजेस आर्टिकल

उन्होंने कहा:

आप some cases में इसे बंद करके महत्वपूर्ण प्रदर्शन सुधार प्राप्त कर सकते हैं

इस उदाहरण को उस लेख से देखें

using (var context = new BloggingContext()) 
{ 
    try 
    { 
        context.Configuration.AutoDetectChangesEnabled = false; 

        // Make many calls in a loop 
        foreach (var blog in aLotOfBlogs) 
        { 
            context.Blogs.Add(blog); 
        } 
    } 
    finally 
    { 
        context.Configuration.AutoDetectChangesEnabled = true; 
    }
}

यह कोड DbSet.Add और SaveChanges विधियों को कॉल करते समय घटित होने वाले DetectChanges को अनावश्यक कॉल से DetectChanges है।

मैं थोड़ा स्टम्प्ड हूं। डेटाबेस में भेजे जाने वाले परिवर्तनों की पहचान करने के लिए DbContext.DetectChanges को कॉल करने के लिए किसी एक को कॉल करने के लिए आवश्यक परिवर्तन ट्रैकिंग को अक्षम करना चाहिए।

हालाँकि, नीचे दिए गए मेरे लॉग से यह स्पष्ट है कि परिवर्तन dbContexts परिवर्तन ट्रैकर द्वारा पंजीकृत किए जा रहे हैं, यहां तक ​​कि झूठा सेट करने के लिए भी।

क्या मैं कुछ भूल रहा हूँ?

इकाई फ्रेमवर्क संस्करण: 5.0.0.0

DbContext वर्ग

public class ProjectContext : DbContext {
    public DbSet<Project> Projects {get;set;}
}

नियंत्रक वर्ग

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!

यदि कोई व्यक्ति Entity Framework Core में AutoDetectChangesEnabled तलाश कर रहा है, तो आप इसे Configuration के ChangeTracker अंतर्गत पा सकते हैं

उपयोग की तरह:

context.ChangeTracker.AutoDetectChangesEnabled = false;

//Do something here
context.PriceRecords.Add(newPriceRecord);

context.ChangeTracker.AutoDetectChangesEnabled = true;




dbcontext