好久没有学习新东西了,最近研究了下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. VMware Workstation 10.0.4.2249910 CN

    VMware Workstation 10.0.4.2249910.exe Workstation10.0.4修复了微软Windows 8.1和Windows Server 2012操作系统中的内存问 ...

  2. MVC 微信支付

    微信支付方式有好几种,俺研究了跟自己需要的两种,即:JS API网页支付和Native原生支付,这两个名词实在是有目的难懂.JS API网页支付:我的理解是在微信浏览器里面可以调用微信支付控件的支付方 ...

  3. qgroundcontrol开发环境搭建源码编译

    qgroundcontrol是一款无人机地面站开源软件,C++/QT开发 在https://github.com/mavlink/qgroundcontrol上就能找到,选择稳定版下载最新的是2.6 ...

  4. HTML5实战——svg学习

    百度百科: SVG可缩放矢量图形(Scalable Vector Graphics)是基于可扩展标记语言(XML),用于描述二维矢量图形的一种图形格式.SVG是W3C制定的一种新的二维矢量图形格式,也 ...

  5. apktool反编译apk文件

    1.首先下载apktool文件,可以从我的网盘下载:http://pan.baidu.com/s/1nvPdbVb 2.将你的apk文件和apktool文件放到一个文件夹下,这里就放到D:\study ...

  6. 【转载】ansys中压力随时间变化的表格加载方法

    原文地址:http://wenku.baidu.com/link?url=w9k94Upqbok0SUNU3L7LOLRDLUtP7W_KyQWK68ajK_nEbO00mO6hzbuBQ01rS07 ...

  7. ajax中返回json数据有"

    1.将“转义为\" string table=sb.ToString(); table.Replace("\"","\\\"");

  8. There is already an open DataReader associated with this Command which must be closed first." exception in Entity Framework

    Fixing the "There is already an open DataReader associated with this Command which must be clos ...

  9. 简单的鼠标可拖动div 兼容IE/FF

    来源:http://www.cnblogs.com/imwtr/p/4355416.html 作者: 主要思路: 一个div,注册监听onmousedown事件,然后处理获取的对象及其相关值(对象高度 ...

  10. [转]MYSQL远程登录权限设置

    Mysql默认关闭远程登录权限,如下操作允许用户在任意地点登录:   1. 进入mysql,GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED B ...