如何查看实体集和未提交的更改?

时间:2011-04-19 17:03:45

标签: .net visual-studio-2010 entity-framework entity-framework-4

我正在使用EF4,在调试时,我想看看将对数据库进行哪些更改。例如,如果我添加一堆新实体,比如联系人,我想查看.SaveChanges()执行时将添加的联系人列表。同样,如果删除将会发生,那么很高兴看到将删除的内容。

VS2010中是否有可视化工具或类似工具可以执行此操作?

谢谢!

2 个答案:

答案 0 :(得分:2)

直接看不到。最好的地方是检查ObjectStateManager,其中包含每个实体和独立关联的状态条目。每个ObjectStateEntry代表实体都填充了Entity属性。

编辑:

如果要在代码中访问这些数据,前一种描述很有用。如果您只是想在调试器中看到它,请将context.ObjectStateManager添加到监视窗口并导航到非公共成员。您将看到以下字段:

  • _addedEntityStore
  • _deletedEntityStore
  • _modifiedEntityStore

答案 1 :(得分:2)

我使用此代码通知挂起的更改,它可能很有用(context是ModelContext的变量):

var changes = new[] { EntityState.Added, EntityState.Deleted, EntityState.Modified }
    .SelectMany(state => context.ObjectStateManager.GetObjectStateEntries(state)
                            .Select(entry => new
                                     {
                                   NewState = state.ToString(),
                                   EntitySetName = entry.EntitySet.Name,
                                   Object = ((entry.Entity == null) ? "<n/a>" : entry.Entity.ToString()),
                                   IsRelation = entry.EntitySet.Name.StartsWith("FK_"),
                                     }))
            .OrderBy(x => x.IsRelation ? 1 : 0)
            .Select(x => string.Format("{0} ({1}): {2}", x.NewState, x.EntitySetName, x.Object))
            .ToArray();

之后,您可以聚合此字符串并显示MessageBox或通知用户,就像在App中一样(例如输出到某些文本框,如“输出”)