前言
前两篇博客为大家解析了EF的框架以及介绍了三种EF搭建方式,那具体EF 如何实现实体与数据库的映射和实现数据持久化呢?本篇博客,小编带大家了解EF的增删改查方式。
首先了解两个个概念:数据持久化和linq表达式。
数据持久化
是将内存中的数据模型转换为存储模型,以及将存储模型转换为内存中的数据模型的统称;数据模型可以是任何数据结构或对象模型,存储模型可以是关系模型、XML、二进制流等;其实,简单来说,就是将数据存储到数据库中,为什么这么说呢?因为持久化就不是暂时的,而存储分为暂存和永存两个方面,暂存指的是存储到了计算机的内存中,电源关闭即丢失。而永存就是存储到了类似数据库里,数据就可以反复使用。除此以外,持久化封装了数据访问细节,为大多数业务逻辑提供面向对象的API。
1. 通过持久化技术可以减少访问数据库数据次数,增加应用程序执行速度;
2. 代码重用性高,能够完成大部分数据库操作;
3. 松散耦合,使持久化不依赖于底层数据库和上层业务逻辑实现,更换数据库时只需修改配置文件而不用修改代码。
Linq表达式
LINQ的全称是Language Integrated Query,中文译成“语言集成查询”,主要用于查询。举一个简单的例子,比如说sql语句:select userName from t_user where userID = 1;
那么我们思考一下,这句sql语句可以分为哪几部分,他们各自的执行顺序是什么。当然有select,from,where三层,执行的顺序当然是先from ,再where,在select,所以将上述sql转成linq为:
from user in DBcontext.t_user where user.userID == 1 select user;
当然查询有很多,具体请点击linq查询!
EF的增删改查
首先,我们先创建一个上下文对象
using(var db = new Entities())
{
//数据操作
}
增
UserInfo user = new UserInfo()
{
UserName = "小王",
UserPass = "123"
};
db.UserInfo.Add(user);
删
第一种
user = new UserInfo()
{
UserID = 1, //根据主键删除
};
db.Entry<UserInfo>(user).State = System.Data.Entity.EntityState.Deleted;
第二种
user = new UserInfo()
{
UserID = 1 //根据主键删除
};
//Attach的实体事先不能已经在内存中,否则上下文会追踪到两个相同键名的实体
db.UserInfo.Attach(user);//将对象添加到EF管理容器中 ObjectStateManager
db.UserInfo.Remove(user);//将对象包装类状态标识为删除
以上两种适用于根据id可以直接找到要删除的数据,如果数据的找到比较复杂,那么适用第三种,先查询,后删除。查询我们使用linq表达式。
using (var db = new Entities())
{
var user = (from v in db.UserInfo
where v.UserID == 1
select v).Single();
db.UserInfo.Remove(user);
db.SaveChanges();
}
改
改也要分为好多种形式,第一种,可以根据ID直接找到就可以直接修改,并且只修改一个属性
user = new UserInfo()
{
UserID = 1,
UserName = "小魏"
};
db.UserInfo.Attach(user);
db.Entry<UserInfo>(user).Property<string>(v => v.UserName).IsModified = true;
第二种,根据ID可以直接找到,但是需要修改很多属性
user = new UserInfo()
{
UserID = 2,
UserName = "小吴",
UserPass = "456"
};
db.Entry<UserInfo>(user).State = System.Data.Entity.EntityState.Modified;
第三种,先查询再修改
using (var db = new Entities())
{
var user = (from v in db.UserInfo
where v.UserName == "小李"
select v).Single();
user.UserPass = "789";
db.SaveChanges();
}