C# 添加时获取DBEntityEntry的主键
我正在尝试获取在EF5应用程序中插入、更新或删除的每个条目的主键信息。我使用的代码与此类似: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
//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];