1、新建一个页面,为其添加一个Button按钮,当点击Button的时候,添加数据到数据库。
2、先看一下右边的Model1.Context.cs文件。 从下图可以看出里面有一个 EFEntities类继承自DbContext,继承父类的时候要为其传入参数 name=EFEntities,其中 name=EFEntities是连接数据库的语句。
1 //------------------------------------------------------------------------------ 2 // <auto-generated> 3 // 此代码已从模板生成。 4 // 5 // 手动更改此文件可能导致应用程序出现意外的行为。 6 // 如果重新生成代码,将覆盖对此文件的手动更改。 7 // </auto-generated> 8 //------------------------------------------------------------------------------ 9 10 namespace EFTest 11 { 12 using System; 13 using System.Data.Entity; 14 using System.Data.Entity.Infrastructure; 15 16 public partial class EFEntities : DbContext 17 { 18 public EFEntities(): base("name=EFEntities") 19 { 20 } 21 22 protected override void OnModelCreating(DbModelBuilder modelBuilder) 23 { 24 throw new UnintentionalCodeFirstException(); 25 } 26 //Dbset表示可以对UserInfo实体类进行一系列的操作。 27 public virtual DbSet<UserInfo> UserInfo { get; set; } 28 } 29 }
3、点击按钮的时候插入数据。
1 protected void Add_Click(object sender, EventArgs e) 2 { 3 UserInfo userInfo = new UserInfo(); 4 userInfo.UserName = "谢尊旭"; 5 userInfo.UserPassword = "123456"; 6 userInfo.UserEmail = "1227111748@qq.com"; 7 //EFEntities 可以理解成EF的上下文数据操作类,负责与数据库打交道。 8 EFEntities db = new EFEntities(); 9 //将数据添加到EF,并且标记为添加标记,返回受影响的行数。 10 db.UserInfo.Add(userInfo); 11 //SaveChanges()数据保存到数据库,根据前面的标记生成对应的Sql语句,交给数据库执行。 12 db.SaveChanges(); 13 }
4、为属性赋值的原理。
执行顺序:应用程序构建好数据后交给DbContext,DbContext要读取Xml中的文件,找到实体和表之间映射关系,生成相应的sql语句,把生成sql语句交给DataBase执行。
5、EF查询数据。
1 protected void Select_Click(object sender, EventArgs e) 2 { 3 //实例化EFEntities类。 4 EFEntities db = new EFEntities(); 5 //查询的时候使用的是linq语句。查询UserId=15。 6 //IQueryable<UserInfo> userInfo = from u in db.UserInfo; 7 //通过下面这句返回的是IQueryable<UserInfo>类型,而不是一个单纯的UserInfo类型,切记。一般都用推断了。 8 var userInfoList = from u in db.UserInfo 9 where u.UserId == 15 10 select u; 11 //EF特点:延迟加载机制。就是数据用到的时候才去数据库中查取,不用的时候就不查询。 12 //就是只有走到循环遍历中的in userInfoList的时候,才开始去数据库中查数据。 13 foreach (var userInfo in userInfoList) //这个时候userInfo类型是UserInfo了,但这里还是用推断了。 14 { 15 Response.Write(userInfo.UserName); 16 } 17 //linq语句的语法和sql语句执行的顺序差不多。 18 //让上面的linq语句变成sql语句为:select * from UserInfo where UserId =15 19 //Sql语句执行的顺序是:from UserInfo 20 // where UserId=15 21 // select * 22 }
6、EF删除数据。
1 protected void Remove_Click(object sender, EventArgs e) 2 { 3 EFEntities db = new EFEntities(); 4 var userInfoList = from u in db.UserInfo 5 where u.UserId == 15 6 select u; 7 //FirstOrDefault()返回序列中的第1个元素,如果序列中不包含任何元素,则返回默认值,默认值为null。 8 //First()返回序列中的第一个元素。如果根据条件去查数据,如果没找到,用First()会抛异常。 9 //SingleOrDefault()返回序列中的唯一元素,如果该序列为空,则返回默认值,如果包含多个元素,此方法则引出异常。 11 UserInfo userInfo = userInfoList.FirstOrDefault(); 12 if (userInfo != null) 13 { 14 //db.UserInfo.Remove(userInfo); 15 //还可以用这种方法打一个删除标记。 16 db.Entry<UserInfo>(userInfo).State = System.Data.Entity.EntityState.Deleted; 17 db.SaveChanges(); 18 Response.Write("删除成功"); 19 } 20 else 21 { 22 Response.Write("删除失败"); 23 } 24 }
7、EF删除数据2,Remove() 和Entity之间的区别。
1 protected void Remove2_Click(object sender, EventArgs e) 2 { 3 EFEntities db = new EFEntities(); 4 UserInfo userInfo = new UserInfo() { UserId = 13 }; 5 //这个时候如果用 db.UserInfo.Remove(userInfo)就会抛出异常。 6 //db.UserInfo.Remove(userInfo); 7 //这句话的意思是让EF操作类先找到这个对象,然后加上删除标记。 8 db.Entry<UserInfo>(userInfo).State = System.Data.Entity.EntityState.Deleted; 9 db.SaveChanges(); 10 }
8、更新数据。
protected void Update_Click(object sender, EventArgs e) { EFEntities db = new EFEntities(); //先查询要获取的对象。 var userInfo = from u in db.UserInfo where u.UserId == 12 select u; //得到具体对象。 var userInfo2 = userInfo.FirstOrDefault(); //修改密码。 userInfo2.UserPassword = "AAAAAAA"; //指定状态。 db.Entry<UserInfo>(userInfo2).State = System.Data.Entity.EntityState.Modified; db.SaveChanges(); Response.Write("修改成功"); }
End。