最近学习了.net 的EF框架,在这里自己总结一下用会的几种操作。
首先先放上数据库的表结构,便于后面的示例操作。
下来我们在项目中添加ADO.NET实体数据模型
模型的内容根据大家的需要进行选择,我在这里选择来自数据库的EF设计器,这样他会帮我自动生成数据库中的EF设计器。
因为我之前创建过这里会显示我之前的连接, 大家可以在这里选择新建连接
因为我使用的 SQL Server,所以这里我选择Microsoft SQL Server,继续
这里根据大家的数据库情况进行选择和配置
配置成功后在选择数据库的位置可以看到我们的数据库,选择需要的数据库后进行确定,我们的准备工作就完成了。
我们先做几个简单的查询体会一下EF的机制
//查询
EFDBEntities efdb = new EFDemo.EFDBEntities();
Students objStudent = efdb.Students.SingleOrDefault(s => s.StudentName == "冯小强");
if (objStudent != null)
{
Console.WriteLine(objStudent.StudentName);
}
//使用where方法查询符合条件的数据
IQueryable<Students> quary = efdb.Students.Where(s => s.StudentId > 100002);
foreach (var item in quary)
{
Console.WriteLine(item.StudentName);
}
在查询的时候,我们主要使用到LINQ进行查询efdb.Students相当于表里的所有列,每一列生成了一个对象放在Students里,这样就可以进行查询,拿到查询的对象或者列表。
状态在EF框架中比较重要,如果不了解状态也就无法进行后面的操作,下面我来简单说一下几种状态,在框架中使用EntityState这个枚举
状态 | 说明 | 具备该状态的对象 |
---|---|---|
Detached | 对象存在,但没有被跟踪 | 新创建的对象 |
Unchanged | 对象尚未经过修改 | 从DbContext中读取的对象,使用Attach()方法添加的对象 ,执行SaveChanges()后的对象 |
Added | 对象为新对象,并且已添加到对象上下文 | 使用Add()方法添加的对象 |
Deleted | 对象已从上下文中删除 | 使用Remove方法溢出的对象 |
Modified | 对象上的一个属性已更改 | 受DbContext管理,并修改属性的对象 |
这里我以一次保存为例,追踪一下对象的状态,供大家理解,代码如下。
Students objStudents = new Students()
{
StudentAddress = "student",
StudentName = "student",
Age = 25,
Birthday = Convert.ToDateTime("1996-04-15"),
ClassId = 2,
Gender = "女",
PhoneNumber = "022-22222223",
StudentIdNo = 120223002199078910,
StudentId = 100053
};
EFDBEntities efdb = new EFDBEntities();
Console.WriteLine(efdb.Entry(objStudents).State.ToString());
efdb.Students.Add(objStudents);
Console.WriteLine(efdb.Entry(objStudents).State.ToString());
int result = efdb.SaveChanges();
Console.WriteLine(efdb.Entry(objStudents).State.ToString());
Console.ReadKey();
通过三个输出语句记录了对象从创建开始,到添加到上下文,到保存的过程,大家先不用关注代码的意思,主要看下状态的变化。
保存修改删除的思路基本一致,这里我做一个简单的说明然后放上代码。
1.创建要添加修改删除的对象信息
2.改变对象状态到相应的删除添加修改状态
3.进行保存efdb.SaveChanges()
代码如下:
修改
Students objStudents = new Students()
{
StudentAddress = "西安",
StudentName = "小娃",
Age = 22,
Birthday = Convert.ToDateTime("1996-04-15"),
ClassId = 2,
Gender = "女",
PhoneNumber = "022-00000000",
StudentIdNo = 120223002199078900,
StudentId = 100009
};
using (EFDBEntities efdb = new EFDBEntities())
{
efdb.Entry<Students>(objStudents).State = System.Data.EntityState.Modified;
Console.WriteLine(efdb.SaveChanges());
}
Console.ReadKey();
添加
Students objStudents = new Students()
{
StudentAddress = "西安",
StudentName = "小娃",
Age = 25,
Birthday = Convert.ToDateTime("1996-04-15"),
ClassId = 2,
Gender = "女",
PhoneNumber = "022-00000000",
StudentIdNo = 120223002199078999,
};
using (EFDBEntities efdb = new EFDBEntities())
{
efdb.Entry<Students>(objStudents).State = System.Data.EntityState.Added;
Console.WriteLine(efdb.SaveChanges());
}
Console.ReadKey();
删除
Students objStudent = new EFDemo.Students()
{
StudentId=100019
};
using(EFDBEntities efdb = new EFDBEntities())
{
efdb.Set<Students>().Attach(objStudent);
efdb.Entry<Students>(objStudent).State = System.Data.EntityState.Deleted;
Console.WriteLine(efdb.SaveChanges());
}
Console.ReadKey();
因为内容比较简单直接贴上代码
修改
string sql = "UPDATE Students SET StudentIdNo = 100000002199078999 WHERE StudentId=100022";
string sql2 = "UPDATE Students SET StudentIdNo = @StudentIdNo WHERE StudentId=@StudentId";
SqlParameter[] param = new SqlParameter[]
{
new SqlParameter("@StudentIdNo",111111112199078999),new SqlParameter ("@StudentId",100022)
};
using (EFDBEntities efdb = new EFDBEntities())
{
//Console.WriteLine(efdb.Database.ExecuteSqlCommand(sql) );
Console.WriteLine(efdb.Database.ExecuteSqlCommand(sql2,param));
}
Console.ReadKey();
查询
string sql1 = "SELECT count(*) from Students";
string sql2 = "SELECT * FROM Students WHERE Gender=@Gender";
SqlParameter[] param = new SqlParameter[]
{
new SqlParameter("@Gender","男")
};
using(EFDBEntities efdb = new EFDBEntities())
{
var stuCount = efdb.Database.SqlQuery<int>(sql1).ToList()[0];
var stuList = efdb.Database.SqlQuery<Students>(sql2, param);
foreach (var item in stuList)
{
Console.WriteLine(item.StudentName);
}
}