【问题标题】:Get Primary Key of DBEntityEntry when Adding添加时获取DBEntityEntry的主键
【发布时间】:2014-09-09 16:21:50
【问题描述】:

我正在尝试获取我在 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)";
}

然而,这段代码的问题是当新记录被插入到数据库时它不起作用。当条目的状态为 EntityState.Added 时,key.EntityKeyValues 的值为空(此代码将 keyName 的值设置为“(NotFound)”。

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

【问题讨论】:

标签: c# entity-framework entity-framework-5 primary-key


【解决方案1】:

我想出了一种方法,将我的原始代码与 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)";
}

到目前为止,它似乎工作正常,即使我添加了一条新记录。

【讨论】:

  • 如果需要值: int keyOrdinal = entry.CurrentValues.GetOrdinal(keyName); string keyVal = entry.CurrentValues.GetValue(keyOrdinal);
  • 也可以使用var keyVal = entry.CurrentValues[keyName];检索值
  • 注意,删除时必须使用entry.OriginalValues[keyName]
【解决方案2】:

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

参考http://webmisterradixlecti.blogspot.co.nz/2013/04/get-primary-key-on-insert-using-entity.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多