实体框架:我可以在从本地读取时关闭AutoDetectChangesEnabled吗?

时间:2016-05-30 12:15:49

标签: c# entity-framework

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

使用此"本地"的所有操作db分为两种类型:读取和写入。当我想阅读一些实体时,我不会改变它。

例如:

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倍。这个逻辑是否正确,一切都会按预期工作?我是否理解为什么EF在查询DetectChanges时会调用DbSet.Local

2 个答案:

答案 0 :(得分:1)

使用AsNoTracking()扩展名读取所有内容,以便实体不会附加到上下文。

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

答案 1 :(得分:0)

将您的实体Attach更改为Context

Context.YourEntity.Attach(YourEntityObject);
// And Save here

或使用

Context.Entry(YourEntityObject).State = EntityState.Modified;