好久没有学习新东西了,最近研究了下EntityFramework,将基础代码贴出来,

Entity Framework 利用了抽象化数据结构的方式,将每个数据库对象都转换成应用程序对象 (entity),而数据字段都转换为属性 (property),关系则转换为结合属性 (association),让数据库的 E/R 模型完全的转成对象模型,如此让程序设计师能用最熟悉的编程语言来调用访问。而在抽象化的结构之下,则是高度集成与对应结构的概念层、对应层和储存层,以 及支持 Entity Framework 的数据提供者 (provider),让数据访问的工作得以顺利与完整的进行。
(1) 概念层:负责向上的对象与属性显露与访问。
(2) 对应层:将上方的概念层和底下的储存层的数据结构对应在一起。
(3) 储存层:依不同数据库与数据结构,而显露出实体的数据结构体,和 Provider 一起,负责实际对数据库的访问和 SQL 的产生。
预备知识:Linq、C#匿名类和拉姆达表达式、
废话不多说,直接上代码
一添加:首先创建试题对象,将要添加的数据复制到对象属性上,然后添加到数据库
   #region 添加
static AdvEFEntities db = new AdvEFEntities();
static void Add()
{
Guid id = new Guid("00000000-0000-0000-0000-000000000000");
//创建实体对象
AdvertisingArea advEF = new AdvertisingArea()
{
QuName = "",
ShengId = ,
ShiId = ,
ShengName = "",
ShiName = "",
QuId = ,
};
//将对象添加到数据库中
//将对象上下文存到AdvertisingArea集合中
// db.Advertising.Add(advEF);
DbEntityEntry<AdvertisingArea> entry = db.Entry<AdvertisingArea>(advEF);
//设置数据状态
entry.State = System.Data.EntityState.Added;
db.SaveChanges();
Console.WriteLine("数据添加完成");
}
#endregion

二查询(1)单表查询:

查询出QuName字段包含”我是新增“的数据

        #region 查询
static void Query()
{
//变相的即时查询
List<AdvertisingArea> area = db.AdvertisingArea.Where(u => u.QuName.Contains("我是新增")).ToList();
area.ForEach(u => Console.WriteLine(u.ToString()));
}
#endregion

    关联查询(2):关联查询要求数据库结构必须存在主外键关系,当生成试题类的时候EF会根据数据库结构生成出每张表的试题类,并且包含当前表的外键的映射关系

  连接查询查询出CommonUser表和CommonUnit表 关联条件unitId=unitId

     #region 2.2 连接查询(生成 inner join) -void QueryInnerJoin()
/// <summary>
/// 2.2 连接查询(生成 inner join)
/// </summary>
static void QueryInnerJoin()
{
//通过Include方法,设置 EF 生成 sql 语句时,使用 inner join 把 地址表对应的 User属性 也查出来
// select * from CommonUser a inner join CommonUnit u on a.udId =u.id
Guid id = new Guid("00000000-0000-0000-0000-000000000000");
IQueryable<CommonUser> addrs = db.CommonUser.Include("CommonUnit").Where(a => a.unitId == id);
foreach (CommonUser add in addrs)
{
Console.WriteLine(add.loginName + ":userName=" + add.CommonUnit.unitName);
} }
#endregion

三修改(1)官方推荐方法:首先查询出要修改的数据, 然后将修改后的数据重新复制个对象属性,然后保存到数据库

   #region 修改
/// <summary>
///
/// </summary>
static void Update()
{
//查询出一个 要修改的对象 -- 注意:此时返回的 是 一个 AdvertisingArea类的 代理类对象(包装类对象)
AdvertisingArea area = db.AdvertisingArea.Where(u => u.Id == ).FirstOrDefault();
Console.WriteLine("修改前" + area.ToString());
//2.修改内容 -- 注意:此时其实操作的 是 代理类对象 的属性,这些属性,会将 值 设置给 内部的 AdvertisingArea对象对应的属性,同时 标记此属性为已修改状态
area.QuName = "";
//.重新保存到数据库 -- 注意:此时 ef上下文,会检查容器内部 所有的对象,找到 标记为修改的 对象,然后 找到 标记为修改的 对象属性,生成对应的 update语句 执行!
db.SaveChanges();
Console.WriteLine("修改后" + area.ToString());
}
#endregion

修改(2)直接修改方法:
  

   #region 直接修改
/// <summary>
///
/// </summary>
static void UpdateZhiJie()
{
//1.查询出一个 要修改的对象
AdvertisingArea usr = new AdvertisingArea() { Id = , ShiName = "asdasdasdasdas" };
//2.将 对象 加入 EF容器,并获取 当前实体对象 的 状态管理对象
DbEntityEntry<AdvertisingArea> entry = db.Entry<AdvertisingArea>(usr);
//3.设置 该对象 为被修改过
entry.State = System.Data.EntityState.Unchanged;
//4.设置 该对象 的 uName属性 为 修改状态,同时 entry.State 被修改为 Modified 状态
entry.Property("ShiName").IsModified = true; //3.重新保存到数据库 -- ef 上下文 会 根据 实体对象的 状态 ,根据 entry.State =Modified 的值 生成 对应的 update sql 语句
db.SaveChanges();
Console.WriteLine("修改成功:");
Console.WriteLine(usr.ToString());
}
#endregion

四删除:

    #region 删除
/// <summary>
///
/// </summary>
static void Delete()
{
AdvertisingArea adv = new AdvertisingArea() { Id = };
db.AdvertisingArea.Attach(adv);
db.AdvertisingArea.Remove(adv);
db.SaveChanges();
Console.WriteLine("删除成功");
}
#endregion

五 批处理(1):可以将所有的操作(增加、修改、删除)添加到集合中,只需SaveChange()一次,即可秩序全部操作

     #region  批处理 -- 上下文 SaveChanges 方法 的 好处!!!!
/// <summary>
/// 批处理 -- 上下文 SaveChanges 方法 的 好处!!!!
/// </summary>
static void SaveBatched()
{ //新增数据
//创建实体对象
AdvertisingArea advEF1 = new AdvertisingArea()
{
QuName = "我是新增1",
ShengId = ,
ShiId = ,
ShengName = "",
ShiName = "",
QuId = ,
}; ;
db.AdvertisingArea.Add(advEF1);
//创建实体对象
AdvertisingArea advEF2 = new AdvertisingArea()
{
QuName = "我是新增2",
ShengId = ,
ShiId = ,
ShengName = "",
ShiName = "",
QuId = ,
}; ;
db.AdvertisingArea.Add(advEF2); //修改数据
AdvertisingArea usr = new AdvertisingArea() { Id = , QuName = "又黑了~~~" };
DbEntityEntry<AdvertisingArea> entry = db.Entry<AdvertisingArea>(usr);
entry.State = System.Data.EntityState.Unchanged;
entry.Property("QuName").IsModified = true; //删除数据
AdvertisingArea u = new AdvertisingArea() { Id = };
//附加到 EF中
db.AdvertisingArea.Attach(u);
//标记为删除 注意:此方法 就是 起到了 标记 当前对象 为 删除状态 !
db.AdvertisingArea.Remove(u); db.SaveChanges();
Console.WriteLine("批处理 完成~~~~~~~~~~~~!");
}
#endregion

批处理(2)循环添加:

  #region  批处理 -- 一次新增 50条数据 -void BatcheAdd()
/// <summary>
/// 批处理 -- 一次新增 50条数据
/// </summary>
static void BatcheAdd()
{
for (int i = ; i < ; i++)
{
AdvertisingArea uObj = new AdvertisingArea()
{
QuName = "我是新增" + i,
ShengId = ,
ShiId = ,
ShengName = "",
ShiName = "",
QuId = ,
};
db.AdvertisingArea.Add(uObj);
}
db.SaveChanges();
}
#endregion

附:底层封装

public class CommonUser
{
EFModel.AdvEFEntities db = new EFModel.AdvEFEntities();
#region 新增实体 public int Add(EFModel.CommonUser area)
{
db.CommonUser.Add(area);
return db.SaveChanges();
}
#endregion #region 根据 用户 id 删除 +int Del(int uId)
/// <summary>
/// 根据 用户 id 删除
/// </summary>
/// <param name="uId"></param>
/// <returns></returns>
public int Del(Guid userId)
{
EFModel.CommonUser usr = new EFModel.CommonUser() { userId = userId };
db.CommonUser.Attach(usr);
db.CommonUser.Remove(usr);
return db.SaveChanges();
}
#endregion #region 根据条件删除 +int DelBy(Expression<Func<P05MODEL.User, bool>> delWhere)
/// <summary>
/// 根据条件删除
/// </summary>
/// <param name="delWhere"></param>
/// <returns></returns>
public int DelBy(Expression<Func<EFModel.CommonUser, bool>> delWhere)
{
List<EFModel.CommonUser> listDeleting = db.CommonUser.Where(delWhere).ToList();
listDeleting.ForEach(u => db.CommonUser.Remove(u));
return db.SaveChanges();
}
#endregion #region 修改 +int Modify(EFModel.CommonUser model, params string[] proNames)
/// <summary>
/// 修改,如:
///EFModel.CommonUser u = newEFModel.CommonUser() { uId = 1, uLoginName = "asdfasdf" };
/// this.Modify(u, "uLoginName");
/// </summary>
/// <param name="model">要修改的实体对象</param>
/// <param name="proNames">要修改的 属性 名称</param>
/// <returns></returns>
public int Modify(EFModel.CommonUser model, params string[] proNames)
{
DbEntityEntry entry = db.Entry<EFModel.CommonUser>(model);
entry.State = System.Data.EntityState.Unchanged;
foreach (string proName in proNames)
{
entry.Property(proName).IsModified = true;
}
return db.SaveChanges();
}
#endregion #region 根据条件查询 +List<EFModel.CommonUser> GetListBy(Expression<Func<EFModel.CommonUser,bool>> whereLambda)
/// <summary>
/// 根据条件查询 +List<EFModel.CommonUser> GetListBy(Expression<Func<EFModel.CommonUser,bool>> whereLambda)
/// </summary>
/// <param name="whereLambda"></param>
/// <returns></returns>
public List<EFModel.CommonUser> GetListBy(Expression<Func<EFModel.CommonUser, bool>> whereLambda)
{
return db.CommonUser.Where(whereLambda).ToList();
}
#endregion #region 根据条件 排序 和查询 + List<EFModel.CommonUser> GetListBy<TKey>
/// <summary>
/// 根据条件 排序 和查询
/// </summary>
/// <typeparam name="TKey">排序字段类型</typeparam>
/// <param name="whereLambda">查询条件 lambda表达式</param>
/// <param name="orderLambda">排序条件 lambda表达式</param>
/// <returns></returns>
public List<EFModel.CommonUser> GetListBy<TKey>(Expression<Func<EFModel.CommonUser, bool>> whereLambda, Expression<Func<EFModel.CommonUser, TKey>> orderLambda, bool desc)
{
if (desc)
{
return db.CommonUser.Where(whereLambda).OrderByDescending(orderLambda).ToList();
}
else
{
return db.CommonUser.Where(whereLambda).OrderBy(orderLambda).ToList();
}
}
#endregion #region 分页查询 + List<EFModel.CommonUser> GetPagedList<TKey>
/// <summary>
/// 分页查询 + List<EFModel.CommonUser> GetPagedList<TKey>
/// </summary>
/// <param name="pageIndex">页码</param>
/// <param name="pageSize">页容量</param>
/// <param name="whereLambda">条件 lambda表达式</param>
/// <param name="orderBy">排序 lambda表达式</param>
/// <returns></returns>
public List<EFModel.CommonUser> GetPagedList<TKey>(int pageIndex, int pageSize, Expression<Func<EFModel.CommonUser, bool>> whereLambda, Expression<Func<EFModel.CommonUser, TKey>> orderBy, bool desc)
{
if (desc)
{
return db.CommonUser.Where(whereLambda).OrderByDescending(orderBy).Skip((pageIndex - ) * pageSize).Take(pageSize).ToList();
}
else
{
return db.CommonUser.Where(whereLambda).OrderBy(orderBy).Skip((pageIndex - ) * pageSize).Take(pageSize).ToList();
} }
#endregion
}

EntityFramework基础的更多相关文章

  1. EntityFramework 基础的crud

    EntityFramework 基础的crud操作 根据上一张实体映射的demo学习基础的crud操作 1.增加 BlogDbContext dbContext = new BlogDbContext ...

  2. EntityFramework 基础提供程序在 Open 上失败

    最近项目开始上线,所以抽时间学习了一下EF.虽然项目中一直在用,但是因为一些原因,一直是知其然不知其所以然,紧紧只限于会用而已.这两天自己搭建了一个MVC的EF框架,虽然也有参考网上各种资料,但是依然 ...

  3. EntityFramework 基础提供程序在 Open 上失败。

    问题 System.Data.EntityException: 基础提供程序在 Open 上失败. ---> System.Data.SqlClient.SqlException: 在与 SQL ...

  4. 你所不知道的库存超限做法 服务器一般达到多少qps比较好[转] JAVA格物致知基础篇:你所不知道的返回码 深入了解EntityFramework Core 2.1延迟加载(Lazy Loading) EntityFramework 6.x和EntityFramework Core关系映射中导航属性必须是public? 藏在正则表达式里的陷阱 两道面试题,带你解析Java类加载机制

    你所不知道的库存超限做法 在互联网企业中,限购的做法,多种多样,有的别出心裁,有的因循守旧,但是种种做法皆想达到的目的,无外乎几种,商品卖的完,系统抗的住,库存不超限.虽然短短数语,却有着说不完,道不 ...

  5. Prism+MaterialDesign+EntityFramework Core+Postgresql WPF开发总结 之 基础篇

    本着每天记录一点成长一点的原则,打算将目前完成的一个WPF项目相关的技术分享出来,供团队学习与总结. 总共分三个部分: 基础篇主要争对C#初学者,巩固C#常用知识点: 中级篇主要争对WPF布局与美化, ...

  6. entityframework分布式事务中遇到的 “与基础事务管理器的通信失败”的解决方法

    首先是ef的多数据库操作实现事务的方法 public int AddDifferenceDB(userinfo1 user1, userinfo user) { ; using (var test2D ...

  7. EntityFramework(1)基础概念与Database First

    基本概念 EntityFramework是微软推出的一款ORM工具,关于ORM的概念请参考博客https://www.cnblogs.com/huanhang/p/6054908.html.这篇文章对 ...

  8. entityframework学习笔记--008-实体数据建模基础之继承关系映射TPH

    Table per Hierarchy Inheritance 建模 1.让我们假设你有如图8-1中的表,Employee表包含hourly employees 和salaried employees ...

  9. entityframework学习笔记--007-实体数据建模基础之继承关系映射TPT

    Table per Type Inheritance (TPT)建模 1.假设你有两张表与一张公共的表密切相关,如图7-1所示,Businiss表与eCommerce表.Retail表有1:0...1 ...

随机推荐

  1. SharePoint 2016 Beta 2 使用体验

    博客地址:http://blog.csdn.net/FoxDave 上一篇主要描述了安装SharePoint 2016的过程,本篇写一些概览性的东西. 首先打开管理中心(依然是在安装完会有Issue ...

  2. 2014-04-09 互联网Web安全职位面试题目汇总

    Domain 解释一下同源策略 同源策略,那些东西是同源可以获取到的 如果子域名和顶级域名不同源,在哪里可以设置叫他们同源 如何设置可以跨域请求数据?jsonp是做什么的? Ajax Ajax是否遵循 ...

  3. 如何编译spring源码,并导入到eclipse中

    wsc@WSC-PC /d/wsc/study-spring-source$ git clone https://github.com/spring-projects/spring-framework ...

  4. 【C++ STL编程】queue小例子

    STL是标准化组件,现在已经是C++的一部分,因此不用额外安装什么. #include <queue> #include <iostream> using namespace ...

  5. OpenResty 安装及使用(第一篇安装)

    OpenResty搭建 1.openResty介绍 OpenResty (也称为 ngx_openresty)是一个全功能的 Web 应用服务器.它打包了标准的 Nginx 核心,很多的常用的第三方模 ...

  6. OD调试篇8

    那么今天需要破解的呢,是这样一款软件. 程序刚刚进去会发现一个nag弹窗   说没有注册,要花20美金才能注册.只有5天的限制期限可以用了 进去之后 点击help里的关于这款软件   也显示了这是一个 ...

  7. Maven概述

    Apache Maven的定义:Maven是一个项目管理工具,它包含了一个项目对象模型(Project Object Model,pom),一组标准集合,一个项目生命周期(Project Lifecy ...

  8. mudOS源码 options.h配置详细选项

    /* options.h配置详细选项—————————————————————————-将 MudOS 下载解压以后可以在相应目录的根目录中找到 options.h 这个文件.如果修 改了这个文件,那 ...

  9. 自定义webkit搜索框样式

    好吧,这是个有点儿蛋疼的文章,每个浏览器都可以有自己的行为和表现,只是webkit在apple的带领下,在UI上走的更远了一点儿,但是却给我们带来了点儿困扰,因为很多情况下,我们希望搜索框在所有的浏览 ...

  10. centos7+nginx 1.9.0+php-fpm+phpstorm+xdebug+vmware开发环境搭建

    1.php-fpm yum install php-fpm 默认配置在本地9000端口监听 service php-fpm restart启动 2.nginx 1.9.0 需先安装gcc zlib o ...