Proxy EF4测试集合或相关实体是否为自跟踪实体的代理

Proxy EF4测试集合或相关实体是否为自跟踪实体的代理,proxy,ef4-code-only,Proxy,Ef4 Code Only,全部, 我从EntityFramework4(还不是CTP5)开始,研究将NHibernate迁移到EF的复杂性 我们有一些代码测试集合或相关实体是否是代理,如果是,则执行一些不同的代码。如果集合是而不是代理(即,它已经加载到上下文中),那么我们直接对集合执行其他操作 我已经将此代码迁移到集合使用IRelatedEnd接口,但是将我的ICollection强制转换为IRelatedEnd的行为会导致EF加载集合。。。结果是,当我在下一行中检查IsLoaded==true时,集合永远不是代理 考虑

全部,

我从EntityFramework4(还不是CTP5)开始,研究将NHibernate迁移到EF的复杂性

我们有一些代码测试集合或相关实体是否是代理,如果是,则执行一些不同的代码。如果集合是而不是代理(即,它已经加载到上下文中),那么我们直接对集合执行其他操作

我已经将此代码迁移到集合使用IRelatedEnd接口,但是将我的ICollection强制转换为IRelatedEnd的行为会导致EF加载集合。。。结果是,当我在下一行中检查IsLoaded==true时,集合永远不是代理

考虑到这是一个定制POCO,我是否需要做一些额外的事情,或者这是预期的行为

同样,是否有测试相关实体是否为代理的方法

非常感谢

测试代理的方法是使用以下内容:

public static bool IsProxy(object type)
{
    return type != null && ObjectContext.GetObjectType(type.GetType()) != type.GetType();
}
此方法适用于EF 4和EF 4.1 Codefirst

至于延迟加载,我从未使用过IRelatedEnd,只是将导航属性保留在POCO的As ICollection中,并确保启用了延迟加载。除此之外,它还能工作

context.ContextOptions.LazyLoadingEnabled = true;

edmx中还有一个用于延迟加载的选项。

您的答案是有效的,但我想指出一个重要的问题:如果您只想找到对象的“真实”类型,您可以始终使用
ObjectContext.GetObjectType()
,而不管它实际上是否是动态代理。我之所以提到这一点,是因为我发现自己是出于这个原因来到这里的,但这样的检查是完全没有必要的。见: