使用EF框架
EF优缺点:
它是微软封装好一种ADO.NET数据实体模型,将数据库结构以ORM模式映射到应用程序中。
优点:
1.简洁的Linq to Sql语句大大提高了开发人员的效率,不要再写复杂的sql语句;
2.不再需要再管应用程序如何去连接数据库;
3.EF可以用作用于数据服务和OData Service的基础设施;
缺点:
1.由于linq语句编译之后就是sql,对于这种自动生成的sql语句无法控制;
2.EF的运行机制会消耗大量内存,大大降低了程序运行效率,从而导致降低了用户在客户端的体验效果;
3.一旦数据结构发生变化,需要更新EF数据model;有时还可能会出现找不到更新过的实体类这种情况;
创建
新建项目,选择已安装——其他项目类型——Visual Studio解决方案,需要注意的是.NET Framework要选择版本为4.0的版本
右键点击我们创建的项目,选择添加——新建项目
已安装——web——空web应用程序,注意的是.NET Framework要与前面的版本选择一致,名称自拟,然后点击确定
右键点击我们刚刚创建的项目,选择添加——新建项
弹出添加新项,选择Visual C#中的数据,选择ADO.NET实体数据模型,名称自己定义,然后点击添加
弹出实体数据模型向导,模型分为“来自数据库的EF设计器”、“空EF设计器模型”、“空Code First模型”和“来自数据库的Code First”,在这里选择的是“来自数据库的EF设计器”,点击下一步
弹出实体数据模型向导,点击新建连接
例子
查询
public static void SearchStudent()
{
using (MySchoolEntities entities = new MySchoolEntities())
{
//按名称查询年级编号
Grade grade = entities.Grades.SingleOrDefault(g => g.GradeName == "S2");//SingleOrDefault返回序列中的唯一记录;如果该序列为空,则返回默认值;如果该序列包含多个元素,则引发异常。
if (grade != null)
{
Console.WriteLine("S2年级的编号为{0}",grade.GradeId);//输出年级名为S2的年级ID
}
//用where()方法查询符合条件的数据
IQueryable<Student> query = entities.Students.Where(s => s.Gender == "男" && s.GradeId == grade.GradeId);
List<Student> stus = query.ToList();//执行查询
Console.WriteLine("学号\t姓名");
foreach (var stu in stus)
{
Console.WriteLine("{0}\t{1}",stu.StudentNo,stu.StudentName);
}
}
}
添加
public static void AddStudent()
{
//添加学生数据
using (MySchoolEntities entities = new MySchoolEntities())
{
entities.Students.Add(
new Student()
{
LoginPwd = "123",
StudentName = "百福美",
Gender = "男",
GradeId = 2,
Birthday = Convert.ToDateTime("1992-4-2")
});
if (entities.SaveChanges() > 0)
{
Console.WriteLine("添加数据成功!");
}
}
}
删除
public static void RemoveStudent()
{
//删除学生数据
using (MySchoolEntities entities = new MySchoolEntities())
{
Student stu = entities.Students.FirstOrDefault(s => s.StudentName == "百福美");//返回序列中的第一条记录,如果没有记录,则返回默认值。
if (stu != null)
{
entities.Students.Remove(stu);//从集合中删除学生对象
}
if (entities.SaveChanges() > 0)
{
Console.WriteLine("删除数据成功!");
}
}
}
修改
public static void ModifyStudent()
{
//修改学生数据
using (MySchoolEntities entities = new MySchoolEntities())
{
Student stu = entities.Students.FirstOrDefault(s => s.StudentName == "百福美");
if (stu != null)
{
stu.LoginPwd = "123456";
}
if (entities.SaveChanges() > 0)
{
Console.WriteLine("修改数据成功!");
}
}
}
Grade.cs
public partial class Grade//在另一个 .cs 文件中也可以定义相同的类
{
public Grade()
{
this.Students = new HashSet<Student>();
this.Subjects = new HashSet<Subject>();
}
public int GradeId { get; set; }
public string GradeName { get; set; }
public virtual ICollection<Student> Students { get; set; }
public virtual ICollection<Subject> Subjects { get; set; }
}
Student.cs
public partial class Student
{
public Student()
{
this.Result = new HashSet<Result>();
}
public int StudentNo { get; set; }
public string LoginPwd { get; set; }
public string StudentName { get; set; }
public string Gender { get; set; }
public int GradeId { get; set; }
public string Phone { get; set; }
public string Address { get; set; }
public System.DateTime Birthday { get; set; }
public string Email { get; set; }
public virtual Grade Grade { get; set; }//如果不用virtual重写的话,系统默认会为你加new关键字,他的作用是覆盖,而virtual的关键作用在于实现多态
public virtual ICollection<Result> Result { get; set; }
}
Result.cs
public partial class Result
{
public int StudentNo { get; set; }
public int SubjectId { get; set; }
public int StudentResult { get; set; }
public System.DateTime ExamDate { get; set; }
public virtual Student Student { get; set; }
public virtual Subject Subject { get; set; }
}