Entity Framework 6 Recipes 2nd Edition(13-7)译 -> 返回只部分填充的实体

问题

你有一个实体里的某个属性很少被读取或和更新,这个属性因为比较大,所以读取和更新都需要付很大的代价.你想有选择的放置这个属性

 

解决方案

假设你有一个如Figure 13-9 所示的模型

 

Figure 13-9. A model with a Resume entity with a Body property that contains the entire text of the applicant’s resume

 

         我们可以通过使用上下文的SqlQuery()方法来直接执行SQL语句,来避免加载实体的一个或多个属性.代码Listing 13-21 展示了这种方式

Listing 13-21. Returning Partially Filled Entities Using Both eSQL and ExecuteStoreQuery()

            using (var context = new EFRecipesEntities())

            {

                var r1 = new Resume

                {

                    Title = "C# Developer",

                    Name = "Sally Jones",

                    Body = "...very long resume goes here..."

                };

                context.Resumes.Add(r1);

                context.SaveChanges();

            }

            using (var context = new EFRecipesEntities())

            {

                // using SqlQuery()

                var result1 =

                context.Resumes.SqlQuery

                ("select ResumeId, Title, Name,'' Body from chapter13.Resume",

                "Resumes", MergeOption.AppendOnly).Single();

                Console.WriteLine("Resume body: {0}", result1.Body);

                var result2 =

                context.Database.SqlQuery<Resume>("select * from chapter13.Resume", "Resumes",

                MergeOption.OverwriteChanges).Single();

                Console.WriteLine("Resume body: {0}", result2.Body);

            }

 

它是如何工作的

获取部分填充的实体是一个方式是通过SqlQuery()方法,该方法是静态的Database对象暴露的,该对象可以从DbContext对象访问.此处我们执行SQL语句来获取除了Body之外的所有属性,Body属性我们只是用空的字符串初始化它.如需要加载,我们通过设置MergeOption值为MergeOption.OverwriteChanges并重新查询数据库.注意,我们的第二个查询将覆盖我们已经对内存中对象的所有修改.记住这种方式会SQL查询是字符串的,没有编译时查检和智能提示.

         Recipe 13-8 (下一节)将演示以模型为中心更简洁的方式来解决这个问题.

posted @ 2016-05-16 14:52  kid1412  阅读(331)  评论(0编辑  收藏  举报