从它的DbEntityEntry对象获取类的DisplayName

时间:2016-10-26 13:54:26

标签: c# entity-framework

我希望在blog post之后跟踪我修改过的数据库条目。

我有这堂课:

[DisplayName("PrettyNameForClass")]
public class UglyClassName
{
...
}

当我保存时,我想保存PrettyNameForClass而不是ClassName。 用于获取ClassName

的代码

我目前正在使用的代码:

var modifiedEntities = ChangeTracker.Entries()
        .Where(p => p.State == EntityState.Modified).ToList();

    foreach (var change in modifiedEntities)
    {
        var entityName = change.Entity.GetType().Name;
        var primaryKey = GetPrimaryKeyValue(change);

1 个答案:

答案 0 :(得分:1)

答案基本上是通过Type.GetCustomAttributes获取相关属性并确定配置的DisplayName

以下代码执行此操作。 GetCustomAttributes上的第二个参数告诉您查看继承层次结构。 Pro:即使实体类型是代理类型,也要获取属性; Contra:如果实体类型继承了设置了DisplayNameAttribute的基类,则结果可能是意外的。

var type = entity.GetType();
var name = type.GetCustomAttributes(typeof(DisplayNameAttribute), true)
    .Select(x => ((DisplayNameAttribute)x).DisplayName)
    .DefaultIfEmpty(type.Name)
    .First(); // what if more names are available for some reason?

简而言之,您是否以及如何处理代理/基类问题取决于您。除此之外,解决方案应该有效。

修改以避免代理/基类问题,您可以尝试

var type = ObjectContext.GetObjectType(entity.GetType());

如果实体是代理类型,这应该解析实际类型。然后可以使用type.GetCustomAttributes(typeof(DisplayNameAttribute), false)仅检查实际类型的属性,而不检查其基本类型。

注意,我没有检查过这个,只是从this Answer

中取出来