如何使用反射获取已断开连接的对象的已加载EF4.0属性的列表

时间:2011-02-22 22:12:34

标签: c# entity-framework-4

如何使用反射来获取已断开连接的EF对象的已加载属性列表?

我可以用

var targetProperty.GetValue(targetObject, null);
var isLoaded = ((System.Data.Objects.DataClasses.RelatedEnd)(propertyValue)).IsLoaded;

但这仅适用于集合属性。对于单个对象属性,它不能很好地工作。它会给出消息

  

ObjectContext实例已经存在   处置,不能再使用了   需要连接的操作。

我使用的代码类似于以下

IEnumerable<object> q;

using(var context = new InfosContext())
{
  q = context.Person.Include("Father").Take(10).ToList();
}
foreach(var value in q)
{
  var sourceProperties = value.GetType().GetProperties().ToList();
  var singleProperties = sourceProperties.Where(i => i.PropertyType.AssemblyQualifiedName.StartsWith("TestProject.Models.Entities")).ToList();
  foreach(var i in singleProperties)
  {
     var propertyValue = i.GetValue(value, null);  // BOOM.  Exception here.
     if (propertyValue != null && ((System.Data.Objects.DataClasses.RelatedEnd)(propertyValue)).IsLoaded) 
     {
     }
  }
}

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

foreach(var i in singleProperties)
{
  var reference = value.GetType().GetProperty(i.Name + "Reference");
  var refValue = reference.GetValue(value, null);
  var isLoaded = ((System.Data.Objects.DataClasses.EntityReference)(refValue)).IsLoaded;
  if(isLoaded)
  {
  }
}