var objectStateEntry = ((IObjectContextAdapter)this).ObjectContext.ObjectStateManager.GetObjectStateEntry(entry.Entity);
string.Join(",",objectStateEntry.EntityKey.EntityKeyValues.Select(item=>item.Value.ToString()).ToArray());这个由ef6.0获得主键的代码,但是表有三个主键,当我运行这段代码时,关于EntityKeyValues的值是空的,我不知道它为什么是空的,我怎么得到主值?
发布于 2016-07-20 08:29:24
此解决方案使用MetadataWorkspace从任何实体检索所有主键名称。你可以根据你的意愿修改它,使之适合你的心灵。
域实体必须有一个名称,否则您将得到一个空引用异常!
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; }
}
}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
发布于 2016-07-22 01:34:32
我知道为什么它是空的,因为我添加了一个新的记录,我没有保存到数据库中,所以它不能得到任何值,谢谢。
https://stackoverflow.com/questions/38464464
复制相似问题