我有一个数据库,其中包含图层和图层上的图形(用于绘制)。我使用SQL Server CE,在应用程序启动时创建数据库上下文,使用db.Layers.Local并在应用程序退出之前调用SaveChanges

使用此“本地”数据库的所有操作都分为两种类型:读取和写入。当我想阅读一些实体时,我不会更改它。

例如:

MainModel db = new MainModel(); //created at application start and stored as field of repository

public List<Figure> GetAllFigures(){
    db.Configuration.AutoDetectChangesEnabled = false; //disable before querying local
    var res =  db.Layers.Local.SelectMany(x=>x.Figures).ToList();
    db.Configuration.AutoDetectChangesEnabled = true;
    return res;
}

public void ChangeLayer(Figure figure, Layer layer){
    figure.Layer = layer;
    db.Figures.Local;
    db.Layers.Local; //manually call detectChanges
}


因此,逻辑是在进行任何更改后在更新时调用DetectChanges,以允许在读取时将其禁用。与更改相比,我的阅读频率要高得多,并且有时不使用DetectChanges进行阅读的速度有时会快100倍。这种逻辑是否正确,一切都会按预期进行?我是否正确理解为什么在查询DetectChanges时EF会调用DbSet.Local

最佳答案

阅读带有AsNoTracking()扩展名的所有内容,以便将实体不附加到上下文。

如建议的那样,在更改属性之前,将其附加到上下文,更改属性(层)并将其标记为已修改,以便将其保留下来。
您也可以调用DetectChanges()以便自动跟踪修改

关于c# - Entity Framework :从本地读取时可以关闭AutoDetectChangesEnabled吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37525439/

10-12 12:43