首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >EntityKey.EntityKeyValues主值为空

EntityKey.EntityKeyValues主值为空
EN

Stack Overflow用户
提问于 2016-07-19 17:02:46
回答 2查看 782关注 0票数 1
代码语言:javascript
复制
 var objectStateEntry = ((IObjectContextAdapter)this).ObjectContext.ObjectStateManager.GetObjectStateEntry(entry.Entity);
    string.Join(",",objectStateEntry.EntityKey.EntityKeyValues.Select(item=>item.Value.ToString()).ToArray());

这个由ef6.0获得主键的代码,但是表有三个主键,当我运行这段代码时,关于EntityKeyValues的值是空的,我不知道它为什么是空的,我怎么得到主值?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-07-20 08:29:24

此解决方案使用MetadataWorkspace从任何实体检索所有主键名称。你可以根据你的意愿修改它,使之适合你的心灵。

域实体必须有一个名称,否则您将得到一个空引用异常!

代码语言:javascript
复制
namespace EntityFrameworkDemo
{
  public class User
  {

    [Key, Column(Order = 0)]
    public long Id { get; set; }

    [Key, Column(Order = 1)]
    public long SecondId { get; set; }

    public bool Checked { get; set; }

  }
}
代码语言:javascript
复制
public class Program
{
  public class MyDbContext : DbContext
  {
    public DbSet<User> Users { get; set; }
    public MyDbContext(string connectionString)
          : base("name=" + connectionString)
    {
    }
  }
  public static IEnumerable<string> GetEntityKeys(DbContext dbContext, Type type)
  {
    var keys = new Collection<string>();

    var objectContext = ((IObjectContextAdapter)dbContext).ObjectContext;
    var edmMembers = objectContext.MetadataWorkspace
      .GetType(type.Name, type.Namespace, DataSpace.CSpace)
      .MetadataProperties
      .Where(mp => mp.Name == "KeyMembers")
      .Select(x => x.Value)
      .Cast<ReadOnlyCollection<EdmMember>>();

    foreach (var key in edmMembers)
    {
      foreach (var edmMember in key)
      {
        keys.Add(edmMember.Name);
      }
    }

    return keys;
  }

  public static void Main(string[] args)
  {
    Database.SetInitializer(new DropCreateDatabaseAlways<MyDbContext>());

    using (var myDbContext = new MyDbContext("DatabaseConnectionString1"))
    {
      myDbContext.Users.Add(new User());
      myDbContext.SaveChanges();

      var user = myDbContext.Users.First();
      var keys = GetEntityKeys(myDbContext, user.GetType());

      foreach (var key in keys)
      {
        Console.WriteLine(key);
      }
    }
  }
}

输出:

Id SecondId

票数 0
EN

Stack Overflow用户

发布于 2016-07-22 01:34:32

我知道为什么它是空的,因为我添加了一个新的记录,我没有保存到数据库中,所以它不能得到任何值,谢谢。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38464464

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档