如何在Entity Framework 4.1中获取主键,即使用DbContext

Gre*_*ern 14 entity-framework entity-framework-4.1

我在这里看到的答案是ObjectContext.使用DbContext时是否有确定实体主键名称的属性?

啊..其中一个我希望实体框架是开源的!我可以从.Find方法收集这个主键名称信息:-)

Lad*_*nka 26

你无法使用DbContext它--DbContext API只是愚蠢的包装器,只有最需要的功能.对于更复杂的一切,您必须转换DbContextObjectContext并使用它.尝试这样的事情:

提取键名称:

public static string[] GetEntityKeyNames<TEntity>(this DbContext context) where TEntity : class
{
  if (context == null)
    throw new ArgumentNullException("context");

  var set = ((IObjectContextAdapter)context).ObjectContext.CreateObjectSet<TEntity>();
  var entitySet = set.EntitySet;
  return entitySet.ElementType.KeyMembers.Select(k => k.Name).ToArray();
}
Run Code Online (Sandbox Code Playgroud)

这是一个提取实体键值的方法:

public static IEnumerable<object> GetEntityKeys<TEntity>(this DbContext context, TEntity entity)
  where TEntity : class
{
  if (context == null)
    throw new NullReferenceException("context");

  var type = typeof(TEntity);

  var set = ((IObjectContextAdapter)context).ObjectContext.CreateObjectSet<TEntity>();
  var entitySet = set.EntitySet;
  var keys = entitySet.ElementType.KeyMembers;
  var props = keys.Select(k => type.GetProperty(k.Name));
  return props.Select(p => p.GetValue(entity));
}
Run Code Online (Sandbox Code Playgroud)

  • 如果TEntity是派生类,我认为这不会起作用.有没有一种方法可以在没有CreateObjectSet <TEntity>的情况下执行此操作? (2认同)
  • 如果其他人尝试这个(EF 6)并收到一条消息说:'TEntity'类型必须是引用类型才能将它用作参数......它需要一个`where TEntity:class`约束.CreateObjectSet签名和def:http://msdn.microsoft.com/en-us/library/dn236948%28v=vs.113%29.aspx (2认同)