oba*_*lis 6 .net c# entity-framework
我想从我的上下文中返回一个项目,如下所示
using (var context = new MyContext())
{
var person = context.People.OrderByDescending(x => x.LastUpdatedDate).FirstOrDefault();
}
Run Code Online (Sandbox Code Playgroud)
我的上下文如下:
public DbSet<Person> People { get; set; }
Run Code Online (Sandbox Code Playgroud)
为什么上面我的person变量的类型不是Person动态代理类型,如System.Data.Entity.DynamicProxies
.Person_5E43C6C196972BF0754973E48C9C941092D86818CD94005E9A759B70BF6E48E6?
如果我使用Find,那么我确实得到类型Person.我想按照上次更新日期的顺序返回前1条记录,OrderByDescending/ FirstOrDefault似乎是最合乎逻辑的方法.
我意识到我可以关闭动态代理生成,但我不认为这是必要的.
假设我的问题是哪个linq方法导致对象被返回为您可能期望的类型并返回动态代理类型?
正如我在实体框架源代码中看到的,它与任何 linq 方法都不相关。创建结果时,它检查是否为ProxyCreationEnabled真,然后检查是否可以为类型创建代理,然后为其创建代理。这是检查是否可以代理类型的规则:
private static bool CanProxyType(EntityType ospaceEntityType)
{
TypeAttributes access = ospaceEntityType.ClrType.Attributes & TypeAttributes.VisibilityMask;
ConstructorInfo ctor = ospaceEntityType.ClrType.GetConstructor(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance | BindingFlags.CreateInstance, null, Type.EmptyTypes, null);
bool accessableCtor = ctor != null && (((ctor.Attributes & MethodAttributes.MemberAccessMask) == MethodAttributes.Public) ||
((ctor.Attributes & MethodAttributes.MemberAccessMask) == MethodAttributes.Family) ||
((ctor.Attributes & MethodAttributes.MemberAccessMask) == MethodAttributes.FamORAssem));
return (!(ospaceEntityType.Abstract ||
ospaceEntityType.ClrType.IsSealed ||
typeof(IEntityWithRelationships).IsAssignableFrom(ospaceEntityType.ClrType) ||
!accessableCtor) &&
access == TypeAttributes.Public);
}
Run Code Online (Sandbox Code Playgroud)
另外来自此 msdn链接:请注意,EF 不会为代理无事可做的类型创建代理。这意味着您还可以通过使用密封类型和/或没有虚拟属性来避免代理。
| 归档时间: |
|
| 查看次数: |
1394 次 |
| 最近记录: |