一、新增
public void Add1()
{
//向表GroupInfo中新增一条数据的写法:
//1.0 实例化EF上下文容器对象
PhoneBookEntities db = new PhoneBookEntities();
//2.0 利用db中的GroupInfo表对应的DbSet<T>泛型类对象 调用Add()方法
var model = new GroupInfo() { GroupName = "测试1", GroupType = "1" };
//将model追加到EF容器中,同时生产代理类状态为Added
db.GroupInfo.Add(model);
//3.0 通知EF容器发出所有的sql语句给数据库
db.SaveChanges();
}
public void Add2()
{
//实例化ef容器对象
PhoneBookEntities db = new PhoneBookEntities();
GroupInfo model;
System.Diagnostics.Stopwatch st = new System.Diagnostics.Stopwatch();
st.Start();
for (int i = 0; i < 1000; i++)
{
//1.0 构造要新增数据的实体,此时没有追加到EF容器
model = new GroupInfo()
{
GroupName = "测试" + i,
GroupType = "1"
};
//2.0 将model追加到EF容器中,此时代理类的状态为 Added
db.GroupInfo.Add(model);
}
//3.0 将model数据生成insert into语句发送给db执行,注意:将来打开关闭100次ado.net链接
db.SaveChanges();
}
二、删除
1.按主键删除
/// <summary>
/// 自定义实体结合ef上下文容器中的DbSet对象下的 Attach()+Remove()
/// </summary>
public void Del1()
{
//1.0 实例化EF上下文容器
PhoneBookEntities db = new PhoneBookEntities();
//2.0 构造要删除数据的实体对象
GroupInfo model = new GroupInfo() { GroupId = 3655 };
//3.0 将model追加到EF容器,此时产生了代理类状态为 System.Data.EntityState.Detached
///System.Data.EntityState.Detached
db.GroupInfo.Attach(model);
//3.0 将传入的model的状态修改成Deleted,但是Remove()方法要求modle必须先存在于ef容器中
db.GroupInfo.Remove(model);
//扫描当前EF容器中的所有状态!= Detached 的代理类,生成sql语句发给数据库执行
db.SaveChanges();
}
//自定义实体结合 EF上下文中的 Entry() + 手动修改代理类的状态值为Deleted实现删除
public void Del2()
{
//1.0 实例化EF上下文容器
PhoneBookEntities db = new PhoneBookEntities();
//2.0 构造要删除数据的实体对象
GroupInfo model = new GroupInfo() { GroupID = 3568 };
//3.0 利用db中的Entry()方法将model追加到EF容器中,此时的状态为Detached
System.Data.Entity.Infrastructure.DbEntityEntry entry = db.Entry(model);
//4.0 将代理类的状态手动修改成Deleted
entry.State = EntityState.Deleted;
//5.0 统一生产sql语句并且发给db执行
db.SaveChanges();
}
2.根据条件删除,也是推荐方式
//EF推荐的删除方式 :先查询 + 再删除 (优点:可以根据任何条件组合进行删除 缺点:先查询操作一次数据库,删除也要操作一次数据库)
public void Del3()
{
PhoneBookEntities db = new PhoneBookEntities();
//2.0 根据条件查询出数据实体,此实体默认已经存在于EF容器中
var list = db.GroupInfo.Where(c => c.GroupName == "测试2");
//var model = db.GroupInfo.FirstOrDefault(c => c.GroupName == "测试1");
//由于Count():遍历list集合统计出数据条数 Any():检查list集合,只要有一条数据则返回true,否则返回false
//此代码演示的是批量删除
if (list != null && list.Any())
{
foreach (GroupInfo item in list)
{
//将实体item的状态值修改成 deleted即可
db.GroupInfo.Remove(item);
}
}
//4.0 统一生产sql发给数据库执行
db.SaveChanges();
}
三、编辑
//EF推荐的方式:先查 再编辑数据 (缺点:打开关闭了两次ado.net的链接)
public void Edit1()
{
PhoneBookEntities db = new PhoneBookEntities();
//1.0 查询id为3660的数据实体,此时实体model已经被EF容器管理,此时状态Unchanged
var model = db.GroupInfo.FirstOrDefault(c => c.GroupId == 3660);
//2.0 修改 GroupName=‘小蛮腰’,将状态修改成System.Data.EntityState.Modified
model.GroupName = "小蛮腰1";//此时由于有改动数据,则会自动将GroupName的IsModified变为true,在SaveChanges()的时候,遍历当前实体中的所有属性,如果其IsModified=true则生成到set 后面,否则不生成
model.GroupType = "1";
//3.0 发送给db执行,扫描到了有个状态为Modified的代理类,则生成update set GroupName='小蛮腰',GroupType='1' where GroupID=3660
db.SaveChanges();
}
public void Edit2()
{
PhoneBookEntities db = new PhoneBookEntities();
//1.0 new GroupInfo的实体,给GroupName重新赋值
GroupInfo model = new GroupInfo()
{
GroupId = 3660,
GroupName = "北京天安门1"
};
//2.0 将model追加到EF容器中,获取了代理类对象entry,此时代理类的状态为Detaceh
System.Data.Entity.Infrastructure.DbEntityEntry entry = db.Entry(model);
//3.0 将状态修改成Modified ,由于Modified 会生成所有的字段的更新,其中
//有一个GroupType=null但是db表中的约束不为null,所以执行sql语句报错
//为了解决此问题:1、将代理类的状态修改成 Unchanged 2、将代理类中的需要更新的字段的IsModified修改成true
entry.State = EntityState.Unchanged;
entry.Property("GroupName").IsModified = true;
//4.0 解决对一个或多个实体验证失败 的方法:关闭EF的实体合法性检查
db.Configuration.ValidateOnSaveEnabled = false;
//4.0 抛出异常:对一个或多个实体验证失败
db.SaveChanges();
}
四、链表查询
//连表查询的方式1 ,生成 INNER JOIN
public void Join1()
{
PhoneBookEntities db = new PhoneBookEntities();
var sql = db.ContactInfo.Join(db.GroupInfo, c => c.GroupId, g => g.GroupId, (c, p) => new { c.ContactName, p.GroupName });
var list = sql.ToList();
list.ForEach(c => Console.WriteLine(c.GroupName + " " + c.ContactName));
}
//连表查询方式2 Include() 产生sql语句是 LEFT OUTER JOIN <-> Left Join
public void Join2()
{
PhoneBookEntities db = new PhoneBookEntities();
db.ContactInfo.Include("GroupInfo").Where(c => c.ID < 3).ToList().ForEach(c => Console.WriteLine(c.ContactName + " 分组=" + c.GroupInfo.GroupName));
}
五、分页
public void Page()
{
PhoneBookEntities db = new PhoneBookEntities();
int pageindex = 2;
int pagesize = 2;
int skipcount = (pageindex - 1) * pagesize;
//注意点:在EF中使用Skip()方法之前必须先进行排序操作
db.ContactInfo.OrderBy(c => c.ID).Skip(skipcount).Take(pagesize).ToList().ForEach(c => Console.WriteLine(c.ID));
}
六、调用存储过程
public void CallPro()
{
PhoneBookEntities db = new PhoneBookEntities();
//调用存储过程Usp_GetAllContact9
int pageindex = 1;
int pagesieze = 2;
int count = 0;
//由于totalCount是一个输出参数,所以由程序员自己定义
System.Data.Objects.ObjectParameter ps = new System.Data.Objects.ObjectParameter("totalCount", count);
var list = db.Usp_GetAllContact9(pageindex, pagesieze, ps);
list.ToList().ForEach(c => Console.WriteLine(c.ID));
Console.WriteLine("总行数=" + ps.Value);
}
七、EF执行sql
public void EFSql()
{
PhoneBookEntities db = new PhoneBookEntities();
string upsql = "update GroupInfo set GroupName='小蛮腰' where GroupId = @id";
//利用EF执行sql语句
System.Data.SqlClient.SqlParameter[] p = new System.Data.SqlClient.SqlParameter[] {
new System.Data.SqlClient.SqlParameter("@id",209)
};
db.Database.ExecuteSqlCommand(upsql, p);
}
八、EF上下文容器中的Set泛型方法的作用
public void Set()
{
PhoneBookEntities db = new PhoneBookEntities();
//db.GroupInfo.FirstOrDefault(c => c.GroupId == 209);
//当db中没有GroupInfo的DbSet<GroupInfo>对象的时候,就无法操作数据表GroupInfo
//解决方案:可以使用db.Set<GroupInfo> 动态实例化DbSet<GroupInfo>对象//等价于 db.GroupInfo
var model = db.Set<GroupInfo>().FirstOrDefault(c => c.GroupId == 209);
}