• EF的使用<三>


    ExecuteSqlCommand与SqlQuery

        在数据上下文DBModel的实例中有个Database属性,其中有两组方法.ExecuteSqlCommand()和.SqlQuery()。它们都可以执行SQL语句,只不过.ExecuteSqlCommand()是不返回结果的,只返回受影响的行数,所以.ExecuteSqlCommand()更适合执行创建、更新、删除操作。.SqlQuery()则会返回查询到的结果,并将结果保存在数据实体中,所以更适合执行查询操作。

    一:使用EF生产的类,其中test表中UserId与user中id是主外键关系

        public partial class test
        {
            public int Id { get; set; }
            public int Num { get; set; }
            public Nullable<int> UserId { get; set; } 
            public virtual user user { get; set; }
        }
    
        public partial class user
        {
            [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
            public user()
            {
                this.test = new HashSet<test>();
            }
        
            public int Id { get; set; }
            public string UserName { get; set; }
            public Nullable<int> Age { get; set; }
            public byte[] Image { get; set; }
        
            [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
            public virtual ICollection<test> test { get; set; }
        }
    
        public partial class user_address
        {
            public int Id { get; set; }
            public int UserId { get; set; }
            public string Address { get; set; }
        }

    二:添加数据

     方法一:    using (ef_testEntities ef = new ef_testEntities())
                    {
                        user u = new user();
                        u.Age = 16;
                        u.UserName = "小花-11";
                        u.test = new List<test>()
                        {
                            new test() { Num = 12,user = u}
                        };
                        ef.user.Add(u);
                        ef.SaveChanges();
                    }
    方法二:     using (ef_testEntities ef = new ef_testEntities())
                    {
    
                        MySqlParameter[] paramers = { new MySqlParameter { ParameterName = "@userid", Value = 8 }, 

    new MySqlParameter { ParameterName = "@address", Value = "杭州" } }; MySqlParameter[] paramers = { new MySqlParameter("@userid", 20), new MySqlParameter("@address", "beijing") }; ef.Database.ExecuteSqlCommand("INSERT into user_address (UserId,Address)VALUES(@userid,@address);", paramers); }
                    //执行存储过程
    方法三:    using (var cmd = ef.Database.Connection.CreateCommand())
                    {
                        MySqlParameter[] paramers = { new MySqlParameter { ParameterName = "@puserId", Value = 12 }, new MySqlParameter { ParameterName = "@paddress", Value = "qinghua" } };
                        cmd.CommandText = "address_add";//存储过程名
                        cmd.CommandType = CommandType.StoredProcedure;
                        cmd.Parameters.AddRange(paramers);
                        if (cmd.Connection.State != ConnectionState.Open) cmd.Connection.Open();
                        cmd.ExecuteNonQuery();
                    }

    三:修改数据

    方法一:    using (ef_testEntities ef = new ef_testEntities())
                    {
                        var entity = (from d in ef.user where d.Id == 20 select d).Single();
                        var tmodel = new test();
                        tmodel.user = entity;
                        tmodel.Num = 100;
                        tmodel.UserId = entity.Id;
                        entity.test.Add(tmodel);//添加一条外键数据
                        ef.SaveChanges();
                    }
    方法二:       using (ef_testEntities ef = new ef_testEntities())
                    {
                        var entity = ef.user.FirstOrDefault(a => a.Id == 3);
                        entity.UserName = "mysql数据库";//修改字段数据
                        ef.SaveChanges();
                    }
    4.为避免先查询数据库,可以直接将 被修改的实体对象 添加到 EF中管理(此时为附加状态Attached),并手动设置其为未修改状态(Unchanged),
    同时设置被修改的实体对象的包装类对象 对应属性为修改状态。 方法三:
    using (ef_testEntities ef = new ef_testEntities()) { user us = new user(); us.Id = 4; us.UserName = "中文简体"; us.Age = 100; ef.Entry<user>(us).State = EntityState.Modified; ef.SaveChanges(); }
    方法四:    using (ef_testEntities ef = new ef_testEntities())
                    {
                        MySqlParameter[] paramers = { new MySqlParameter { ParameterName = "@userid", Value = 37 },
    new MySqlParameter { ParameterName = "@id", Value = 7 },

    new MySqlParameter { ParameterName = "@address", Value = "铜牛文化产业园" } }; ef.Database.ExecuteSqlCommand("UPDATE user_address SET UserId=@userid,Address=@address where id=@id;", paramers); }

    四:删除数据

    方法一: using (ef_testEntities ef = new ef_testEntities())
                {
                    user_address us = new user_address();
                    us.Id = 12;
                    ef.Entry<user_address>(us).State = EntityState.Deleted;//通知上下文这条数据被修改了
                    ef.SaveChanges();
                }
     
    方法二:  using (ef_testEntities ef = new ef_testEntities())
                {
                    var pp = ef.user.FirstOrDefault(a => a.Id == 6);
                    ef.user.Remove(pp);
                    ef.SaveChanges();
                }
    方法三   using (ef_testEntities ef = new ef_testEntities())
                {
                    ef.Database.ExecuteSqlCommand("delete from user_address where id=11; ");
    
                }

    五:查询数据

           ef_testEntities ef = new ef_testEntities();
    //1、查询一条数据 var entity = ef.user.FirstOrDefault(a => a.Id == 37); var tests = entity?.test;

    //2.查询一条数据
    var model = ef.Database.SqlQuery<user>("select * from user where id=37").FirstOrDefault();
          var testModel = model?.test;

    //3、关联表查询[从表数据可以有多条]
          var model1 = (from d in ef.user where d.Id == 37 select d).Single();
          ef.Entry(model1).Collection(a => a.test).Load();
          foreach (var item in ef.test.Local)
          {
              Console.WriteLine(item.Id + "&" + item.Num + "*" + item.UserId);
          }

    //4.分页查询
           var list = ef.user.OrderBy(a => a.Id).Skip(2).Take(3).ToList();
  • 相关阅读:
    玩转----使用数据驱动ddt时,如何写测试报告2种方法
    玩转----svn--入门
    玩转----Selenium家族简介
    起名的含义
    重新开始
    学习django: 庄园漫步
    测试常用的表格
    【Kata Daily 190927】Counting sheep...(数绵羊)
    【Kata Daily 190924】Difference of Volumes of Cuboids(长方体的体积差)
    【Kata Daily 190923】Odder Than the Rest(找出奇数)
  • 原文地址:https://www.cnblogs.com/xiaoyaodijun/p/8065223.html
Copyright © 2020-2023  润新知