如何在没有类实例的情况下获取EF动态代理类的类型

时间:2013-09-16 07:57:09

标签: c# entity-framework entity-framework-5 dynamic-proxy gettype

动态代理的名称类似于ClassName_00394CF1F92740F13E3EDBE858B6D599DFAF87AA5A089245977F61A32C75AA22,其中POCO类简称为Classname

我知道可以使用ObjectContext.GetObjectType(instance.GetType())获取EF动态代理实例的POCO类型,但有一种更简单的方法来获取给定EF类的代理类型:

databaseContext.TableName.First().GetType();

因为这需要在表中有一个类型的实例(通常是这种情况,但这有点“错误”)。

我将类类型传递给一个函数(如下所示),以便某些父/子拖动&删除规则可以应用于TreeNodes(对象实例由TreeNodes的Tag属性引用,因此具有任何EF对象的动态类型)。

if (!AllowChildDrop(e.Node, e.TargetNode, e.DropPosition, typeof(Answer)), typeof(Question)))

所以基本上有一种更容易获得动态类型的方法吗?

if (!AllowChildDrop(e.Node, e.TargetNode, e.DropPosition, context.Answer.First().GetType(), context.Question.First().GetType()))

1 个答案:

答案 0 :(得分:1)

目前无法避免创建实例来发现运行时Type

您应该使用DbSet.Create()而不是First()

  1. 以避免潜在的数据库访问
  2. First()实例可能不是代理(例如,您在调用链中添加了一个实体)
  3. 有关详细信息,请参阅here

      

    []]实例未添加或附加到集合中。如果基础上下文配置为创建代理并且实体类型满足创建代理的要求,则返回的实例将是代理。