Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 添加时获取DBEntityEntry的主键_C#_Entity Framework_Entity Framework 5_Primary Key - Fatal编程技术网

C# 添加时获取DBEntityEntry的主键

C# 添加时获取DBEntityEntry的主键,c#,entity-framework,entity-framework-5,primary-key,C#,Entity Framework,Entity Framework 5,Primary Key,我正在尝试获取在EF5应用程序中插入、更新或删除的每个条目的主键信息。我使用的代码与此类似: //Get collection of each insert, update, or delete made on the entity. IEnumerable<DbEntityEntry> changedEntries = this.ChangeTracker.Entries() .Where(e => e.State == EntityState.Added

我正在尝试获取在EF5应用程序中插入、更新或删除的每个条目的主键信息。我使用的代码与此类似:

//Get collection of each insert, update, or delete made on the entity. 
IEnumerable<DbEntityEntry> changedEntries = this.ChangeTracker.Entries()
    .Where(e => e.State == EntityState.Added
        || e.State == EntityState.Modified
        || e.State == EntityState.Deleted);

foreach (DbEntityEntry entry in changedEntries)
{
    //Get primary key collection
    EntityKey key = ((IObjectContextAdapter)this).ObjectContext.ObjectStateManager
        .GetObjectStateEntry(entry.Entity).EntityKey;

    string keyName;
    //Get name of first key. Make sure a collection was returned.
    if (key.EntityKeyValues != null)
        keyName = key.EntityKeyValues[0].Key;
    else
        keyName = "(NotFound)";
}
//获取对实体进行的每次插入、更新或删除的集合。
IEnumerable changedEntries=this.ChangeTracker.Entries()
其中(e=>e.State==EntityState.Added
||e.State==EntityState.Modified
||e.State==EntityState.Deleted);
foreach(ChangedEntry中的DbEntityEntry)
{
//获取主键集合
EntityKey key=((IObjectContextAdapter)this).ObjectContext.ObjectStateManager
.GetObjectStateEntry(entry.Entity).EntityKey;
字符串键名;
//获取第一个密钥的名称。确保返回了集合。
if(key.EntityKeyValues!=null)
keyName=key.EntityKeyValues[0]。键;
其他的
keyName=“(未找到)”;
}
然而,这段代码的问题是,当一条新记录插入数据库时,它不起作用。当条目的状态为EntityState.Added时,key.EntityKeyValues具有空值(此代码将keyName的值设置为“(NotFound)”


插入记录时,有没有办法获取主键的列名?

我找到了一种方法,将我的原始代码与Gert发布的链接中的代码结合起来:

//Get collection of each insert, update, or delete made on the entity. 
IEnumerable<DbEntityEntry> changedEntries = this.ChangeTracker.Entries()
    .Where(e => e.State == EntityState.Added
        || e.State == EntityState.Modified
        || e.State == EntityState.Deleted);

foreach (DbEntityEntry entry in changedEntries)
{
    EntitySetBase setBase = ObjectContext.ObjectStateManager
        .GetObjectStateEntry(entry.Entity).EntitySet;

    string[] keyNames = setBase.ElementType.KeyMembers.Select(k => k.Name).ToArray();
    string keyName;
    if (keyNames != null)
        keyName = keyNames.FirstOrDefault();
    else
        keyName = "(NotFound)";
}
//获取对实体进行的每次插入、更新或删除的集合。
IEnumerable changedEntries=this.ChangeTracker.Entries()
其中(e=>e.State==EntityState.Added
||e.State==EntityState.Modified
||e.State==EntityState.Deleted);
foreach(ChangedEntry中的DbEntityEntry)
{
EntitySetBase setBase=ObjectContext.ObjectStateManager
.GetObjectStateEntry(entry.Entity).EntitySet;
string[]keyNames=setBase.ElementType.KeyMembers.Select(k=>k.Name.ToArray();
字符串键名;
if(键名!=null)
keyName=keyNames.FirstOrDefault();
其他的
keyName=“(未找到)”;
}
到目前为止,即使在我添加新记录时,它似乎也能正常工作。

在SaveChanges()之后,您的主键已就位。您可以在SaveChanges()之前保留changedList,然后在SaveChanges()之后保存更改日志


Ref

为什么要一次又一次地从对象中获取键名?应该从元数据中获取它:。如果需要值:int-keyOrdinal=entry.CurrentValues.GetOrdinal(keyName);string-keyVal=entry.CurrentValues.GetValue(keyOrdinal);也可以使用
var-keyVal=entry.CurrentValues[keyName];