Entity Framework 学习第一天 续_.NET_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > .NET > Entity Framework 学习第一天 续

Entity Framework 学习第一天 续

 2014/6/15 23:23:50  天道酬勤0322  程序员俱乐部  我要评论(0)
  • 摘要:改写第一天的增删改查方法,观察增删改查的本质1usingSystem;2usingSystem.Collections.Generic;3usingSystem.Data.Entity.Infrastructure;4usingSystem.Linq;5usingSystem.Text;6usingSystem.Threading.Tasks;78namespaceEFConsole9{10classProgram11
  • 标签:学习 Framework 第一天

改写第一天的增删改查方法,观察增删改查的本质

class="code_img_closed" src="/Upload/Images/2014061523/0015B68B3C38AA5B.gif" alt="" />logs_code_hide('69ed338e-0e3f-4c66-9bf7-cc5a816dddde',event)" src="/Upload/Images/2014061523/2B1B950FA3DF188F.gif" alt="" />
 1 using System;
 2 using System.Collections.Generic;
 3 using System.Data.Entity.Infrastructure;
 4 using System.Linq;
 5 using System.Text;
 6 using System.Threading.Tasks;
 7 
 8 namespace EFConsole
 9 {
10     class Program
11     {
12         public static remotingEntities dbContext = new remotingEntities();
13         static void Main(string[] args)
14         {
15             //addOtherMethod();
16             
17             //updateOtherMethod();
18             //removeOtherMethod();
19             Console.ReadKey();
20         }
21         /// <summary>
22         /// 另一种添加方法
23         /// </summary>
24         public static void addOtherMethod()
25         {
26             int res = -1;
27             user tempData = new user() { id="123",name="EntityEntry"};
28             DbEntityEntry<user> entry = dbContext.Entry<user>(tempData);
29             entry.State = System.Data.EntityState.Added;
30             res=dbContext.SaveChanges();
31             Console.WriteLine(res>0?"添加成功"+tempData.name:"添加失败");
32         }
33         /// <summary>
34         /// 另一种修改方法
35         /// </summary>
36         public static void updateOtherMethod()
37         {
38             int res = -1;
39             user tempData = new user() { id = "123", name = "update EntityEntry" };
40             DbEntityEntry<user> entry = dbContext.Entry<user>(tempData);
41             entry.State = System.Data.EntityState.Unchanged;
42             entry.Property("name").IsModified = true;
43             res=dbContext.SaveChanges();
44             Console.WriteLine(res>0?"修改成功":"修改失败");
45         }
46         /// <summary>
47         /// 另一种删除方法
48         /// </summary>
49         public static void removeOtherMethod()
50         {
51             int res = -1;
52             user tempData = new user() { id = "123" };
53             DbEntityEntry<user> entry = dbContext.Entry<user>(tempData);
54             entry.State = System.Data.EntityState.Deleted;
55             res=dbContext.SaveChanges();
56             Console.WriteLine(res>0?"删除成功":"删除失败");
57         }
58     }
59 }
View Code

依次执行添加,修改,删除,我们会看到结果。

官方推荐当修改实体数据的时候是先从数据库中查出该实体,然后在做修改操作,但我们总会认为这种方法不太好,在效率上不是很高。所以我们需要找到更好的方法。

我们可以把dbContext上下文看成一个容器,当我们使用它将数据库中的数据查询出来时,它会将数据维护起来,放到容器中,但此时的数据是代理数据,而不是我们的真实数据实体。只有这样才能提高效率,我们可以打开数据库跟踪一下ef发出的sql语句,当一条实体多个字段的时候,如果你只修改一条字段的时候,sql语句也只是修改了一个字段。例如user包括name,age等字段,使用官方推荐的方法,我们想修改id=123的数据,我们先将其查询出来,这样这个实体所有的属性就有值了,当我们只将name属性修改的时候,执行saveChange时,sql语句update中只更新name,而没有更新其他字段的值,这是怎么做到的呢?对,这就是前面说到的代理类起的作用,我们假设代理类将每个属性放置一个标志,如果没有修改过该属性的值,该标志为false,否则为true。当我们更新代理类的时候上下文就可以根据标志来生成sql语句,看代码中修改方法 entry.Property("name").IsModified = true; 这句就是通过设置name属性的标志位,通知上下文,我们将name的属性改变了,所以生成的sql语句中只更新了name字段值。删除和添加同样如此,通知上下文,我们进行添加或caozuo.html" target="_blank">删除操作。效率上是不是有很大的提高呢?顺便说一下,上线文的saveChanges也是提高效率的方法,该方法可以进行批处理,就是说添加多个对象的时候connection只进行一次连接,执行多条语句,可以跟踪一下数据库查看一下。其实svaeChanges也就是遍历上线文中的每个数据代理对象,看哪个对象状态是增删改方法,生成sql语句,然后一次性执行。

发表评论
用户名: 匿名