我希望在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);
答案 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
中取出来