为什么EF返回代理类而不是实际实体?

Mal*_*are 31 c# entity-framework

当我想要实际的实体类时,我遇到了实体框架返回代理的问题.我第一次运行我的代码时,一切运行正常(没有代理),但每次迭代之后,我的一个DbSets总是返回代理而不是实际类型.

我在每次迭代后处理上下文,所以我不明白为什么第一次通过它工作,并且每次都没有.

我的代码在这一行失败了.我的所有POCO都设置了Table属性,但因为它返回了一个代理类,所以没有table属性.

TableAttribute attrib = (TableAttribute)attributes.Single();
Run Code Online (Sandbox Code Playgroud)

DbContext中有一些幕后静态魔法在我摧毁对象后生活吗?

我使用以下内容将对象移动到内存中

MajorClasses = ctx.MajorClasses.ToArray();
Run Code Online (Sandbox Code Playgroud)

我也试过了

MajorClasses = ctx.MajorClasses.AsNoTracking().ToArray();
Run Code Online (Sandbox Code Playgroud)

在我的OnModelCreating中,我有以下设置

base.Configuration.ProxyCreationEnabled = false;
            base.Configuration.LazyLoadingEnabled = false;
Run Code Online (Sandbox Code Playgroud)

cad*_*ll0 47

您可以设置ObjectContext.ContextOptions.ProxyCreationEnabled为false.这将阻止您使用一些EF的花哨功能,如延迟加载,我相信更改跟踪.

就您的应用而言,它应该能够像代表它们所代表的类型一样对待代理.你有特定的问题吗?

编辑

我们有一些代码需要POCO类型而不是代理类型,我们执行以下操作来检测当前类型是否是代理.

if (entityType.BaseType != null && entityType.Namespace == "System.Data.Entity.DynamicProxies")
{
    entityType = entityType.BaseType;
}
Run Code Online (Sandbox Code Playgroud)

  • @Matthew我从来没有说过它.但它会为您提供一个表示POCO类的Type对象.从这里,您可以使用反射来获取有问题的属性.如果我的答案无法解决您的问题,请发布一个新问题,我会看看是否可以回答. (3认同)

小智 6

要在Entity Framework 5中关闭代理创建,您可以使用以下方法,

_dbContext.Configuration.ProxyCreationEnabled = false;
Run Code Online (Sandbox Code Playgroud)

在使用上下文提取数据之前,只需设置此属性一次.