检索实体的键值

时间:2016-01-07 14:05:30

标签: .net entity-framework entity-framework-6

对于更改日志记录功能,我需要检索任何实体的主键值。这将与表名,更改的属性名以及旧值和新值一起写入审计表。

我可以反映特定实体的类型并查找[Key]属性。这可以在我的情况下工作,因为我使用代码优先,属性,只使用单列键。但我不确定(未缓存)反射使用的运行时性能。

是否有一个更强大的"官方"从EF已知的实体获取主键值的方法

请使用最新的EF版本(6.1.3)。我不能使用访问弃用或删除功能的EF 4/5解决方案。

代码示例:

class MyEntity1
{
    [Key]
    public Guid KeyColumn { get; set; }
    // ...
}

class MyEntity2
{
    [Key]
    public string EntityId { get; set; }
    // ...
}

class MyContext : DbContext
{
    public DbSet<MyEntity1> Entities1 { get; set; }
    public DbSet<MyEntity2> Entities2 { get; set; }

    public object GetEntityKey(object entity)
    {
        return ???(entity);
        // Expected: The value of the property with [Key]
    }
}

PS:我正在使用以下所有手动解决方法,以防任何人寻找相同的解决方案。但是添加新实体时维护起来并不简单。

public object GetEntityKey<T>(T entity)
{
    if (typeof(T) == typeof(MyEntity1))
    {
        return ((MyEntity1)(object)entity).KeyColumn;
    }
    if (typeof(T) == typeof(MyEntity2))
    {
        return ((MyEntity2)(object)entity).EntityId;
    }
    // Important: Makes you aware of new entities
    throw new NotSupportedException("The specified entity type is not supported.");
}

1 个答案:

答案 0 :(得分:2)

我无法评论为此使用反射的性能,但您可以通过使用反射并查找[Key]属性(我假设它们都具有此属性)来找到给定实体的PK:

public object GetEntityKey<T>(T entity)
{
    return typeof(T).GetProperties().Where(x => Attribute.IsDefined(x, typeof(KeyAttribute))).Single().GetValue(entity);
}