如何获取具有未知名称的DbEntityEntry EntityKey对象

我不应该使用DbEntityEntry的复杂属性方法或属性方法来获取EntityKey对象。 我找不到MSDN的任何示例,但我认为这在Entity Framework 5中是可能的。我不知道实体密钥或实体的名称,因为我使用的是通用存储库接口。

如果你有一个DbEntityEntry对象,你首先找到包装的ObjectContext获取EntityKey

 var oc = ((IObjectContextAdapter)dbContext).ObjectContext; 

然后你可以找到实体键

 oc.ObjectStateManager.GetObjectStateEntry(dbEntityEntryObject.Entity) .EntityKey 

编辑

我创建了两个扩展方法,让您接近您想要的:

 public static EntityKey GetEntityKey(this DbContext context, T entity) where T : class { var oc = ((IObjectContextAdapter)context).ObjectContext; ObjectStateEntry ose; if (null != entity && oc.ObjectStateManager .TryGetObjectStateEntry(entity, out ose)) { return ose.EntityKey; } return null; } public static EntityKey GetEntityKey( this DbContext context , DbEntityEntry dbEntityEntry) where T : class { if (dbEntityEntry != null) { return GetEntityKey(context, dbEntityEntry.Entity); } return null; } 

现在你可以做到

 var entityKey = dbContext.GetEntityKey(entity); 

要么

 var entityKey = dbContext.GetEntityKey(dbEntityEntryObject); 

运行时将选择正确的重载。

请注意,当实体具有复合键时,您提出的语法( dbEntityEntryObject.Property() )无法工作。 您必须从实体本身获取EntityKey