我有一个数据库,其中包含图层和图层上的图形(用于绘制)。我使用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/