获取实体的属性列表

时间:2011-09-27 17:00:02

标签: c# entity-framework-4

我正在使用实体框架。

当对象的EntityState为“Added”时,我想获取实体的属性列表,并循环遍历它们。

这是我正在做的示例代码。

var newEntities = ObjectStateManager.GetObjectStateEntries(EntityState.Added);
foreach (var entry in newEntities)
{
    var entityName = entry.EntitySet.Name;
    var newProps = ObjectStateManager.GetObjectStateEntry(entry.EntityKey).GetModifiedProperties();
    var currentNewValues = ObjectStateManager.GetObjectStateEntry(entry.EntityKey).CurrentValues;

    foreach (var propName in newProps)
    {
        var newValue = currentNewValues[propName];
    }
}

如您所见,我使用

  

ObjectStateManager.GetObjectStateEntry(entry.EntityKey).GetModifiedProperties();

获取属性列表,但仅当State为EntityState.Modified时才有效。

感谢。

以下是满足我需求的方式

有了这个,我可以获得一个实体的所有属性并获得他的价值。

 var newEntities = ObjectStateManager.GetObjectStateEntries(EntityState.Added);
 foreach (var entry in newEntities)
 {
      if (entry.State == EntityState.Added)
      {
           var prop = entry.Entity.GetType().GetProperties();
           var entityName = entry.EntitySet.Name;

           var currentNewValues = ObjectStateManager.GetObjectStateEntry(entry.EntityKey).CurrentValues;
           foreach (var propName in prop.Where(p => p.PropertyType.Namespace == "System"))
           {
                var newValue = currentNewValues[propName.Name];
           }
      }
 }

2 个答案:

答案 0 :(得分:0)

您枚举的每个条目都应该有一个'State'属性,它是EntityState,因此您可以使用if子句过滤它们或使用linq,

        foreach (var entry in newEntities)
        {
            if (entry.State == EntityState.Added)
            {
                  // continue and get property list
            }
        }

或者

        var addedEntities = newEntities.Where(x => x.State == EntityState.Added); 

此外,我不确定您是否需要查看“修改过的属性”。如果它是刚刚添加的实体那么为什么它会有任何修改过的属性而不仅仅是新属性(即CurrentValues)?

答案 1 :(得分:0)

foreach (var entry in newEntities)
{
    if (entry.State == EntityState.Added)
    {
        // continue and get property list
        var currentValues = entry.CurrentValues;
        for (var i = 0; i < currentValues.FieldCount; i++)
        {
            var fName = currentValues.DataRecordInfo.FieldMetadata[i].FieldType.Name;
            var fCurrVal = currentValues[i];
        }
    }
}