EF的增删改查
创建上下文对象:WordBoradEntities db = new WordBoradEntities();
一、添加:
//1.1创建实体对象
User uObj = new User()
{
uName = "刘德华",
uLoginName = "aaa",
uPwd = "asdfasdfasdfsadf",
uIsDel = false,
uAddtime = DateTime.Now
};
//1.2通过EF新增到数据库
//1.2.1将对象加入到数据上下文的 User集合中
db.Users.Add(uObj);
//1.2.2调用数据上下文的保存方法,将对象存数数据库
db.SaveChanges();
二、查询:
1、单行 var userLogin = db.T_UserLogin.Where(d => d.LoginID == loginID).FirstOrDefault();
2、多行
1)var list = db.Users.Where(u => u.uName == "刘德华").ToList();
2)List list = db.Users.Where(u => u.uName == "刘德华").ToList();
3、连接查询:
1)linq连接查询: from a in db.User join b in db. UsersAddresses on a.Id equals b.udid
2)EF连接查询:IQueryable addrs = db.User.Include("UsersAddresses").Where(a => a.Id == 1);
3)另一种连接查询:var list=db.User.Join(db. UsersAddresses,c=>c.Id,g=>g.udid,(c,g)=>new{Name=c.Name,GroupName=g.GroupName});
三、删除:
EF中实现删除有三种方式,版本一、二都是根据主键删除,版本三是根据任意条件到数据库查询然后再根据查询的结果进行删除,实际上版本三也是根据查询出来的结果中的主键进行删除。
1 :根据主键删除
//实例化一个Users对象,并指定Id的值
Users user = new Users() { Id = 1 };
//将user附加到上下文对象中,并获得EF容器的管理对象
var entry = db.Entry(user);或者 var entry=db.Entry(user);
//设置该对象的状态为删除
entry.State = EntityState.Deleted;
//保存修改
db.SaveChanges();
Console.WriteLine("删除成功!");
2:根据主键删除
//实例化一个Users对象,并指定Id的值
Users user = new Users() { Id = 1 };
//将user附加到上下文对象中
db.Users.Attach(user);
//删除user对象
Db.Users.Remove(user);
//保存修改
db.SaveChanges();
Console.WriteLine("删除成功!");
3:根据条件先查询出来然后再删除
var list= db.Users.Where(u => u.Name ==”张三”);
if(list!=null&&list.Any())
{
Foreach(User item in list)
{
db.User.Remove(item);
}
}
db.SaveChanges();
四、修改:
1.官方推荐的修改方式(先查询,再修改)
//将Id为2的Users数据取出
var user = db.Users.Where(u => u.Id == 2).FirstOrDefault();
Console.WriteLine("修改之前:" + user.UserName);
//修改UserName属性
user.UserName = "222222222222222";
//保存修改
db.SaveChanges();
Console.WriteLine("修改之后:" + user.UserName);
2.自己优化的修改方式
//1)创建出一个要修改的对象
User use = new User() { uId = 8,uName="小白~~~"};
//2)将对象加入 EF容器,并获取当前实体对象的状态管理对象
DbEntityEntry entry = db.Entry(user);
//3)设置该对象为未被修改过
entry.State = System.Data.EntityState.Unchanged;
//4)设置该对象的 uName属性为修改状态,同时 entry.State 被修改为 Modified 状态
entry.Property("uName").IsModified = true;
//5)关闭EF实体合法性检查(如果创建出来的要修改的数据有的字段没有赋值则关闭实体合法性检查,如果所有字段都赋值了则不用关闭EF实体合法性检查)
db.Configuration.ValidateOnSaveEnabled = false;
//6)重新保存到数据库 -- ef 上下文会根据实体对象的状态,根据 entry.State =Modified 的值生成对应的 update sql 语句.
db.SaveChanges();
Console.WriteLine("修改成功:");
五、增删改查的另一种方式,纯sql。
当遇到复杂的需求,需要书写复杂语句,但有不特别熟悉EF语法时有两种方案:
1.数据库中创建视图;
2纯sql方式;
//1)查询SqlQuery
result.slList = db.Database.SqlQuery("select Precision,Year,LandCover, sum(Area) as Area from [EcoTypes] where LandCover=@type group by Precision, Year, LandCover", new SqlParameter("@type", "森林")).Select(d=> d.Area).ToList();
//2)增删改:ExecuteSqlCommand
db.Database.ExecuteSqlCommand("").ToString();
详情请db.Database. 此时会出现所有方式和相应的说明文字。
注释: db是视图对象模型。
EcologyEntities db = new EcologyEntities();
六、当以上方法都不能满足是,大不了写点原生ADO代码,一个项目两种ORM也是可以的,只要能解决复杂问题。
(编辑:雷林鹏 来源:网络)