What?
EF的全称是Entity Framework,也叫实体框架。是微软以ADO.Net为基础开发出来的对象关系映射(ORM)解决方案,它解决了对象持久化问题,将程序员从编写麻烦的SQL语句当中解放出来。就是用操作对象的方式来操作数据库,自动生成与数据库表结构的映射关系。EF相当于一个中继,完成数据转换。
Why?
- 应用程序可以通过更加以应用程序为中心的概念性模型(包括具有继承性、复杂成员和关系的类型)来工作。
- 可以在不更改应用程序代码的情况下更改概念性模型与特定于存储的架构之间的映射。
- 应用程序不再对特定的数据引擎或存储架构具有硬编码依赖性。
- 开发人员可以使用可映射到各种存储架构(可能在不同的数据库管理系统中实现)的一致的应用程序对象模型。
- 多个概念性模型可以映射到同一个存储架构。语言集成查询支持可为查询提供针对概念性模型的编译时语法验证。
How?
使用EF进行数据库开发的时候有两个东西要建:建数据库(T_Persons),建模型类(Person)。根据这两种创建的顺序有EF的三种创建方法:
(DataBase First 简单,方便,但是当项目打了之后会非常的痛苦;Code First入门门槛高,但是适合大于大项目。Model First…基本上没有人使用)
- DataBase First(数据库优先):先创建数据库表,然后自动生成EDM文件,EDM文件生成类模型;
- Model First(模型优先):先创建Edm文件,Edm文件自动生成模型类和数据库;
- Code First(代码优先):程序员自己写模型类,然后自动生成数据库。没有Edm。
当修改模型类之后,EF使用“DB Miguration” 自动帮我们更新数据库,但是这种方式只适用于项目的初始阶段不合适大项目的开发流程和优化。在初学EF阶段,我们最好禁用“DB Miguration”, 采用更实际的“手动建数据库和模型类”的方式。方便我们理解EF原理。
练习一下吧(Code First)
安装EF
添加项目——控制台应用程序
安装EF——程序包管理控制台——输入:Install-Package EntityFramework
App.Config 配置连接字符串
<connectionStrings>
<add name="connStr" connectionString="Data Source=192.168.17.132; Initial Catalog=newssystem;User ID=sa;Password=123" providerName="System.Data.SqlClient"/>
</connectionStrings>
代码部分
实体类
namespace FluentAPI1
{
public class Person
{
public long Id { get; set; }
public string Name { get; set; }
public DateTime CreateDateTime { get; set; }
public int? Age { get; set; }
}
}
namespace FluentAPI1
{
public class Dog
{
public long Id { get; set; }
public string Name { get; set; }
}
}
实体关系映射
namespace FluentAPI1.EntityConfig
{
class PersonConfig :EntityTypeConfiguration<Person>
{
public PersonConfig()
{
this.ToTable("T_Persons");
}
}
}
namespace FluentAPI1.EntityConfig
{
class DogConfig : EntityTypeConfiguration<Dog>
{
public DogConfig()
{
this.ToTable("T_Dogs");
}
}
}
数据库上下文
namespace FluentAPI1
{
//DbContext是数据库上下文,定义了从实体对象到数据库的映射,从数据库中检索数据,就要使用它。
class MYContext : DbContext
{
public MYContext():base("name=connStr")
{
}
//DbSet:表示可用于创建,读取,更新和删除操作的实体集。
public DbSet<Person> Persons { get; set; }
public DbSet<Dog> Dogs { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
//OnModelCreating:重写此方法以进一步配置通过DbSet派生上下文中属性中公开的实体类型按惯例发现的模型。
//AddFromAssembly是从某个程序集中加载所有继承自EntityTypeConfiguration类到配置中
//列明映射规则
base.OnModelCreating(modelBuilder);
modelBuilder.Configurations.AddFromAssembly(Assembly.GetExecutingAssembly());
}
}
}
增删改查
static void Main(string[] args)
{
using (MYContext ctx = new MYContext())
{
Person p1 = new Person();
p1.Age = 18;
p1.CreateDateTime = DateTime.Now;
p1.Name = "EF";
ctx.Persons.Add(p1);
ctx.SaveChanges();//对已添加,已修改或已删除状态的实体的数据库执行INSERT,UPDATE或DELETE命令。
//两种查询的方法
//1.
//var persons = ctx.Persons.Where(p => p.Age > 10);
//2.
/*var persons = from p in ctx.Persons
where p.Age > 10
select p;
foreach(var p in persons )
{
Console.WriteLine(p);
}*/
//删除一条数据
/* var person = ctx.Persons.Where(p => p.Id == 4).SingleOrDefault();
if(person==null)
{
Console.WriteLine("已被删除");
}
else
{
ctx.Persons.Remove(person);
ctx.SaveChanges();
}*/
//删除多条数据(最保险的方法,先查在删,大量数据时候用“状态管理”)
/*ctx.Persons.RemoveRange(ctx.Persons.Where(p => p.Age > 10));
ctx.SaveChanges();*/
//更新数据
var persons = ctx.Persons;
foreach(var p in persons)
{
p.Age++;
}
ctx.SaveChanges();
Console.ReadKey();
}
}
图示