对于更改日志记录功能,我需要检索任何实体的主键值。这将与表名,更改的属性名以及旧值和新值一起写入审计表。
我可以反映特定实体的类型并查找[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.");
}
答案 0 :(得分:2)
我无法评论为此使用反射的性能,但您可以通过使用反射并查找[Key]属性(我假设它们都具有此属性)来找到给定实体的PK:
public object GetEntityKey<T>(T entity)
{
return typeof(T).GetProperties().Where(x => Attribute.IsDefined(x, typeof(KeyAttribute))).Single().GetValue(entity);
}