EntifyFramework6.0延迟加载、动态代理实例

结论:

1.默认 EntityFramework 使用延迟加载,使用动态代理实例

2.无论是否启用延迟加载,对于IQueryable 都是在拼接查询sql,并没有直接去数据库执行sql

3.跟踪实践证明,对于关联表数据获取没有没有跟踪到执行Sql语句(不一定正确)

4.不使用延迟加载或动态代理实例,无法获取关联表的数据

1.EF访问数据库跟踪

//1.默认 EntityFramework 使用延迟加载,使用<span style="font-family: Arial, Helvetica, sans-serif;">动态</span><span style="font-family: Arial, Helvetica, sans-serif;">代理类</span>
OneContext _context = new OneContext();
//如果禁用延迟加载,则获取关联表数据失败
//_context.Configuration.LazyLoadingEnabled = true;
//如果禁用动态代理实例,则获取关联表数据失败
//_context.Configuration.ProxyCreationEnabled = true;


//无论是否启用延迟加载,对于IQueryable 都是在拼接查询sql,并没有直接去数据库执行sql
IQueryable<course> query = _context.courses;
query = query.Where(q => q.cname.Contains("数"));
query = query.Where(q => q.tno.StartsWith("8"));
query = query.OrderBy(q => q.cno);
query = query.Skip(0)
    .Take(10);
List<course> list = query.ToList();
_context.Configuration.ProxyCreationEnabled = false;
foreach (var item in list)
{
    //跟踪实践证明,对于关联表数据获取没有没有跟踪到执行Sql语句
    Console.WriteLine(item.teacher.tname);
    Console.WriteLine(item.scores.Count);
    Console.WriteLine(item.scores.FirstOrDefault().degree);
    Console.WriteLine(item.scores.Where(q => q.degree > 0).Count());
}
捕捉到的查询Sql:

SELECT 
    [Extent1].[cno] AS [cno], 
    [Extent1].[cname] AS [cname], 
    [Extent1].[tno] AS [tno]
    FROM [dbo].[course] AS [Extent1]
    WHERE ([Extent1].[cname] LIKE '%数%') AND ([Extent1].[tno] LIKE '8%')
    ORDER BY [Extent1].[cno] ASC
    OFFSET 0 ROWS FETCH NEXT 10 ROWS ONLY 
使用动态代理的当前类的类型及关联表类的类型:

{System.Data.Entity.DynamicProxies.course_3C71DB354A7624EC26628EE0EAFFB0EC61746E1845FD11671DB7AB0301886F89}
{System.Data.Entity.DynamicProxies.teacher_1E6252B7EE21A887DD4B968C576BEC02ACDE90FC6BE7BF2547C98F8CB5872586}
使用动态代理前后的区别:



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值