ORM框架EF的基本使用

介绍

EF是微软基于ADO.NET开发的ORM框架。

ORM对象关系映射,是将实体对象与数据库数据进行映射。这样不需要写sql,仅仅对实体对象进行修改就可以改变数据库数据。

使用

引用

这个visual studio集成,可以手动添加实体模型
ORM框架EF的基本使用

增删改查

查询

	
            //方法一 Linq to Entities
            var info = from p in db.dat_online_sh where p.KeyId != "" orderby p.KeyId descending select p;
            foreach (var item in info)
            {
               
            }

            // 方法二:Lamada表达式
            var info2 = db.dat_online_sh.Where<dat_online_sh>(p => p.KeyId != "").OrderByDescending(p => p.KeyId);
            foreach (var item in info)
            {
     
            }

            // 方法三:db SQL Language
            string strSQL = "SELECT value a FROM dat_online_sh as a WHERE a.KeyId!='' ORDER BY a.ID DESC";
            var info3 = ((IObjectContextAdapter)db).ObjectContext.CreateQuery<dat_online_sh>(strSQL);
            foreach (var item in info)
            {
              
            }

            // 方法四:SqlQuery
            try
            {
                string strSQL2 = "SELECT * FROM dat_online_sh WHERE KeyId!='' ORDER BY KeyId DESC";
                var info4 = db.Database.SqlQuery<dat_online_sh>(strSQL2);
                foreach (var item in info)
                {
               
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
  

				//单条
  				Region region = new Region();
                region.RegionID = 5;
                region.RegionDescription = "青岛";
                db.Region.Add(region);
                db.SaveChanges();

				//多条
				List<Region> regions = new List<Region>();
                regions.Add(new Region { RegionID = 6, RegionDescription = "济南" });
                regions.Add(new Region { RegionID = 7, RegionDescription = "合肥" });
                regions.Add(new Region { RegionID = 8, RegionDescription = "天津" });
                db.Region.AddRange(regions);
                Response.Write(db.SaveChanges());
                
                 for (int i = 10; i < 20; i++)
                {
                    Region region = new Region();
                    region.RegionID = i;
                    region.RegionDescription = $"第{i}条";
                    db.Region.Add(region);
                }
                Response.Write(db.SaveChanges());

//用Remove()方法时,必须先从EF中查到才能删除
UserInfo user = from u in context.UserInfo where u.Id=343 select u;
context.UserInfo.Remove(user);

 


// 用这种方法不用先查再删除,其实内部做了查询,推荐用这种;
UserInfo user = new UserInfo(){Id=343};
context.Entry<UserInfo>(user).State = System.Data.EntityState.Deleted;

//先New一个实体对象,加入需要修改的属性,加入主键值
CompanyAddr DefaultData = new CompanyAddr
{
	id = 1,
    IsDefault = true //需要修改的值
};

//方法一:实体对象所有属性均有赋值,或者不赋值但存在默认值的,结果将会修改为默认值,或者为null
db..Entry<CompanyAddr>(DefaultData).State = System.Data.EntityState.Modified;

//方法二:实体对象部分属性均赋值
//添加到EF管理容器中,并获取 实体对象 的伪包装类对象
DbEntityEntry<CompanyAddr> entry = db.Entry<CompanyAddr>(DefaultData);
//如果使用 Entry 附加 实体对象到数据容器中,则需要手动 设置 实体包装类的对象 的 状态为 Unchanged**
entry.State = EntityState.Unchanged;    
//标识 实体对象 某些属性 已经被修改了
entry.Property("IsDefault").IsModified = true;

//方法三:
//直接针对属性进行状态设置,但是当前对象并没有被上下文跟踪
contextState.Set<CustomerInfo>().Attach(customerState);
//标识 实体对象 某些属性 已经被修改了
contextState.Entry<CustomerInfo>(customerState).Property("customerName").IsModified = true;

//关键性的注意点来了,这里针对的是方法二、三!
//关闭验证实体有效性(ValidateOnSaveEnabled)这个开关
//因为New的一个新实体对象,里面肯定很多值不会修改,而默认是空的情况;
//再进行SaveChanges的时候,会进行实体验证,这个时候就会出错
//当然,如果是你需要修改的数据输入值真的有问题,也是不能修改成功的,例如上面的IsDefault 不赋值为未布尔型,还是会报错的
db.Configuration.ValidateOnSaveEnabled = false;

db.SaveChanges();

//恢复验证实体有效性(ValidateOnSaveEnabled)这个开关【如果后续有其他操作,记得恢复】
db.Configuration.ValidateOnSaveEnabled = true;

上一篇:详解SQL Server数据库索引【转】


下一篇:阿里云服务器centos8系统安装和使用boost