C# 获取实体的属性列表

C# 获取实体的属性列表,c#,entity-framework-4,C#,Entity Framework 4,我正在使用实体框架 我想在对象的EntityState被“添加”时获取实体的属性列表,并循环遍历它们 下面是我正在做的一个示例代码 var newEntities = ObjectStateManager.GetObjectStateEntries(EntityState.Added); foreach (var entry in newEntities) { var entityName = entry.EntitySet.Name; var newProps = Object

我正在使用实体框架

我想在对象的EntityState被“添加”时获取实体的属性列表,并循环遍历它们

下面是我正在做的一个示例代码

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()

获取属性列表,但它仅在状态为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];
           }
      }
 }

枚举的每个条目都应该有一个“State”属性,即EntityState,因此您可以使用if子句筛选它们,也可以使用linq

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


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

您要枚举的每个条目都应该有一个“State”属性,即EntityState,因此您可以用If子句过滤掉它们,或者使用linq

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

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

foreach(newEntities中的var条目)
{
if(entry.State==EntityState.Added)
{
//继续并获取属性列表
var currentValues=entry.currentValues;
对于(变量i=0;i
foreach(新实体中的var条目)
{
if(entry.State==EntityState.Added)
{
//继续并获取属性列表
var currentValues=entry.currentValues;
对于(变量i=0;i
是的,这就是我的问题所在。我不知道如何得到财产清单。“Modified Properties”返回一个已修改属性的列表,在这种情况下,这不是获取我的属性列表的正确方法。如何获取此列表?你到底想完成什么?在我看来,您只需要使用.GetCurrentValues()方法。msdn文档说明GetModifiedProperties()返回自上次调用SaveChanges()以来已更改的对象属性的名称。如果它是上次调用SaveChanges()时不存在的新实体,它将不会有任何修改的属性。是的,这就是我的问题所在。我不知道如何得到财产清单。“Modified Properties”返回一个已修改属性的列表,在这种情况下,这不是获取我的属性列表的正确方法。如何获取此列表?你到底想完成什么?在我看来,您只需要使用.GetCurrentValues()方法。msdn文档说明GetModifiedProperties()返回自上次调用SaveChanges()以来已更改的对象属性的名称。如果它是上次调用SaveChanges()时不存在的新实体,则它不会有任何已修改的属性。您想要哪些属性?实体类的所有属性(所有属性的值)的列表?我只想要属性int32、string、bool等,而不是像ex(“EntityObject,EntityReference”)这样的实体类。然后获取这些属性的值。例如,如果我有实体联系人,我希望获取ContactID、ContactName等。为了更清楚,我需要只返回实体类的属性(即表中列的名称)的方法。您需要哪些属性?实体类的所有属性(所有属性的值)的列表?我只想要属性int32、string、bool等,而不是像ex(“EntityObject,EntityReference”)这样的实体类。然后获取这些属性的值。例如,如果我有实体联系人,我想获取ContactID、ContactName等。为了更清楚,我需要只返回实体类的属性(即表中列的名称)的方法。
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];
        }
    }
}