EF的增删改查(转载)

2018-06-17 23:19:25来源:未知 阅读 ()

新老客户大回馈,云服务器低至5折

EF的增删改查

 

创建上下文对象:TestDBEntities db = new TestDBEntities();

 

一、增:

    //1.1创建实体对象

       User uObj = new User()

       {    

           uName = "刘德华",    

           uLoginName = "aaa",    

           uPwd = "asdfasdfasdfsadf",    

           uIsDel = false,    

           uAddtime = DateTime.Now    

       };    

        //创建实体方式二         

//User user = new User();

//user.LoginName = "ssss";

//user.Mail = "ssss";

//user.PassWord = "ssss";

//user.Plane = "ssss";

//user.UserName = "ssss";

//user.cardNo = "ssss";

//user.phone = "ssss";

       //1.2.1告诉EF咱们对上面的实体做一个插入操作    

        db.Users.Add(uObj);    

       //1.2.2告诉上下文把实体的变化保存到数据库里面去    

        db.SaveChanges();   

 

         //补充:添加时可以关联导航属性:

                UserInfo与OrderInfo存在一对多关系

 

            ////创建一个用户顺便定义两个订单

            //UserInfo userInfo = new UserInfo();

            //userInfo.UName = "yang";

 

            ////告诉上下文我们对这个实体做添加操作

            //dbContext.UserInfo.Add(userInfo);

 

            ////添加两个订单

            //OrderInfo order1 = new OrderInfo();

            //order1.Content = "shit1";

            //dbContext.OrderInfo.Add(order1);

 

            //OrderInfo order2 = new OrderInfo();

            //order2.Content = "shit2";

            //dbContext.OrderInfo.Add(order2);

 

            ////关联三个实体

            ////1、通过用户添加订单实体到自己的导航属性

            //userInfo.OrderInfo.Add(order1);

            ////2、通过订单指定用户实体

            //order2.UserInfo = userInfo;

            ////order2.UserInfoID = userInfo.ID;

             

 

三、删除:

EF中实现删除有三种方式,版本一、二都是根据主键删除,版本三是根据任意条件到数据库查询然后再根据查询的结果进行删除,实际上版本三也是根据查询出来的结果中的主键进行删除。

1 :根据主键删除

  //实例化一个Users对象,并指定Id的值

  Users user = new Users() { Id = 1 };

  //将user附加到上下文对象中,并获得EF容器的管理对象

  var entry = db.Entry<User>(user);或者 var entry=db.Entry(user);

  //设置该对象的状态为删除

  entry.State = EntityState.Deleted;\

//以上两步可并作一步

//dbContext.Entry<USER>(user).State = System.Data.EntityState.Modified;

  //保存修改

  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();

 

四、修改:

//方式一:先将Id为2的Users数据查询出来,在修改。

      var user = db.Users.Where(u => u.Id == 2).FirstOrDefault();

      //修改UserName属性

      user.UserName = "222222222222222";

      //保存修改

      db.SaveChanges();

//方式二:声明一个User实体

USER user = new USES();

user.LoginName = "ssss111--------";

user.Mail = "ssss";

user.PassWord = "ssss";

user.Plane = "ssss";

user.UserName = "ssss";

user.cardNo = "ssss";

user.phone = "ssss";

user.ID = 8;//修改删除的时候必须指定id(主键)

//3、告诉上下文咱们的对此实体进行更新操作。

//db.Entry<USER>(user).State = System.Data.EntityState.Modified;

db.USER.Attach(user);//附加到上下文里面来管理

//指定要修改的字段(强类型方式)

db.Entry<USER>(user).Property<string>(u => u.LoginName).IsModified = true;

//指定要修改的字段(弱类型方式)

//db.Entry<USER>(user).Property("LoginName").IsModified = true;

//上面的泛型<USER>、<string>可以省略,因为可以编译阶段会根据实体自动推断,如下

//db.Entry (user).State = System.Data.EntityState.Modified;

//db.Entry (user).Property (u => u.LoginName).IsModified = true;

 

//4、告诉上下文把实体的变化保存到数据库里面去。

db.SaveChanges();//执行sql脚本的地方。

 

方式三

   //1)创建出一个要修改的对象

   User use = new User() { uId = 8,uName="小白~~~"};

   //2)将对象加入 EF容器,并获取当前实体对象的状态管理对象

   DbEntityEntry<User> entry = db.Entry<User>(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();

 

一、查:

查询方式有两种,一种是拉姆达表达式(一般点出来),一种是linq(类似于sql)。

linq 方式举例

IQueryable<USER> temp = from u in db.USER

where u.ID > 4

select u;

拉姆达表达式:

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<User> 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)拉姆达表达式连接查询:IQueryable<UsersAddress> 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});

查询还远远不只这点。

 

五、增删改查的另一种方式,纯sql。

  当遇到复杂的需求,需要书写复杂语句,但有不特别熟悉EF语法时有两种方案:

  1.数据库中创建视图或存储过程

  2纯sql方式;

  //1)查询SqlQuery

result.slList = db.Database.SqlQuery<DataTemp>("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. 此时会出现所有方式和相应的说明文字。  

 

六、当以上方法都不能满足是,大不了写点原生ADO代码,只要能解决复杂问题。

 

转载来源 https://www.cnblogs.com/zhuyuchao/p/5634196.html

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:关于c#(vs)dategridview控件继承不能修改的问题

下一篇:C# 获取用户IP地址(转载)