我有一个数据库,包含图层上的图层和图形(用于绘图)。我使用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
?
答案 0 :(得分:1)
使用AsNoTracking()扩展名读取所有内容,以便实体不会附加到上下文。
根据建议,在更改属性之前,将其附加到上下文,更改属性(图层)并将其标记为已修改,以便将其保留。 您也可以调用DetectChanges(),以便自动跟踪修改
答案 1 :(得分:0)
将您的实体Attach
更改为Context
Context.YourEntity.Attach(YourEntityObject);
// And Save here
或使用
Context.Entry(YourEntityObject).State = EntityState.Modified;