什么是Entity Framework ?

微软官方提供的ORM工具,ORM让开发人员节省数据库访问的代码时间,将更多的时间放到业务逻辑层代码上。EF提供变更跟踪、唯一性约束、惰性加载、查询事物等。开发人员使用Linq语言,对数据库操作如同操作Object对象一样省事。
简而言之:就是一个可以将数据库与数据实体关联的框架。

参考

微软官方文档:Microsoft Docs

文章内容

  1. EF框架的基础使用(非MVC下使用)
  2. 如何与数据库建立连接
  3. 表与实体,列与属性的关联
  4. CRUD操作

数据库连接

添加EF框架程序包

项目—>鼠标右键—>管理NuGet程序包—>浏览—>输入EntityFramework搜索—>选择第一个—>安装

连接配置

如果项目中没有Web.Config文件,此处可以跳过,可以直接使用string直接连接(请看下文)。
在项目的Web.Config添加数据库配置代码,如下所示:

<configuration>...
<connectionStrings><add name="DeMonDBContext" connectionString="Data Source=(localdb)\ProjectsV13;database=DeMon;  integrated security=True;uid=;pwd=;" providerName="System.Data.SqlClient" /></connectionStrings>...
</configuration>

各参数详解:

1.name 配置别名,标识
2.connectionString 连接字符串,配置信息

参数 解释 备注
Data Source 服务器地址 (此处为我的本地数据库)
database 指定的数据库
integrated security 是否连接安全 默认为true即可
uid 数据库的用户名 (因为是本地库,所以为空)
pwd 数据库的密码 (因为时本地库,所以为空)

3.providerName 数据库连接驱动

数据库类型 驱动
Aceess System.Data.OleDb
Oracle System.Data.OracleClient(Oracle.DataAccess.Client)
SQLite System.Data.SQLite
Sql System.Data.SqlClient

实体与表的关联

EF框架的核心就是实体与数据表的关联。

新建实体类

public class Movie {public int Id { get; set; }public string Name { get; set; }}

新建一个类继承DbContext

DbContext有多个重载的构造方法,可以通过配置别名,标识或者连接字符串与数据库建立连接。

public class DeMonContext : DbContext {//配置别名,标识//public DeMonContext() : base("DeMonDBContext") {}//连接字符串(注意\的转义字符,即\\)string str = "Data Source=(localdb)\\ProjectsV13;database=DeMon;integrated security=True;uid=;pwd=;";public DeMonContext() : base(str) {}//指定Movie实体与数据表关联//如果存在数据表Movies(实体+s,复数命名),则使用//否则自动在数据库下创建Movies数据表public DbSet<Movie> Movies { get; set; }
}

去除复数命名

如果不想以复数命名的格式。
在上面代码添加如下代码。

public class DeMonContext : DbContext {...protected override void OnModelCreating(DbModelBuilder modelBuilder) {modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();//去除复数命名}}

实体名与数据库表名不一致?

如果数据表已经存在,且命名很长或者与我们习惯的不一致。
在上面代码添加如下代码。

public class DeMonContext : DbContext {...protected override void OnModelCreating(DbModelBuilder modelBuilder) {...//指定MovieDetail实体与数据表Movie_Detail关联modelBuilder.Entity<MovieDetail>().ToTable("Movie_Detail");//实体关联对应的表名}}

实体属性与表字段不一致?

使用column特性的构造函数,映射字段到实体属性。

public class MovieDetail {public int ID { get; set; }public string Describe { get; set; }//指定MovieId与表字段Movie_Id关联[Column("Movie_Id")]public int MovieId { get; set; }}

CRUD

讲完了配置,连接,关联。接下来讲一下CRUD(增,读,改,删)操作。

初始化

声明一个数据库连接的上下文对象。

//创建一个EF数据上下文对象
private DeMonContext db = new DeMonContext();

public string CreateMovie(string Name) {//将要添加的数据,封装成对象Movie movie = new Movie { Name = Name};db.Movies.Add(movie);//当调用SaveChanges()时,EF会遍历所有的代理类对象,并根据标志生成相应的sql语句db.SaveChanges();return "添加成功!";}
public string CreateMovie(string Name) {Movie movie = new Movie { Name = Name };//标记为Add状态db.Entry(movie).State = EntityState.Added;db.SaveChanges();return "添加成功!";}

读(查找)

1.获取全部数据

public string GetMovies() {var list = db.Movies.ToList();//将对象转为Json//需要添加NewtonSoft.Json程序包return JsonConvert.SerializeObject(list);}

2.主键(Id)查找

public string GetMovies(int id) {var list = db.Movies.Find(id);return JsonConvert.SerializeObject(list);}

3.非主键查找
通过Name字段值为Name的查找。

public string GetMovies(string Name) {var list = db.Movies.Where(x=>x.Name == Name).ToList();return JsonConvert.SerializeObject(list);}

改(更新)

1.根据主键(Id)修改Name字段

public string UpdateMovieById(int id, string Name) {Movie movie = new Movie { Id = id, Name = Name };//标记为修改状态db.Entry(movie).State = EntityState.Modified;db.SaveChanges();return "修改成功!";}

2.根据非主键字段修改
将Name字段值为Name1的修改为Name2。

public string UpdateMovieByName(string Name1, string Name2) {//先根据Name字段查找var list = db.Movies.Where(x => x.Name == Name1).ToList();foreach (Movie movie in list) {movie.Name = Name2;db.Entry(movie).State = EntityState.Modified;}db.SaveChanges();return "修改成功!";}

1.根据的主键(Id)删除

public string DeleteMovieById(int id) {Movie movie = new Movie { Id = id };//标记为删除状态db.Entry(movie).State = EntityState.Deleted;db.SaveChanges();return "删除成功!";}
public string DeleteMovieById(int id) {Movie movie = new Movie { Id = id };//将要删除的对象附加到EF容器中db.Movies.Attach(movie);db.Movies.Remove(movie);db.SaveChanges();return "删除成功!";}
public string DeleteMovieById(int id) {//可以先Find实体再删除Movie movie = db.Movies.Find(id);db.Movies.Remove(movie);db.SaveChanges();return "删除成功!";}

2.根据非主键删除
删除Name字段值为Name的。

 public string DeleteMovieByName(string Name) {//先根据Name字段查找var list = db.Movies.Where(x => x.Name == Name).ToList();foreach (Movie movie in list) {db.Movies.Remove(movie);}db.SaveChanges();return "删除成功!";}

C# EF框架基础(非MVC)使用笔记相关推荐

  1. 菜鸟级三层框架(EF+MVC)项目实战之 系列一 EF零基础创建领域模型

    系列概述:全系列会详细介绍抽象工厂三层的搭建,以及EF高级应用和 ASP.NET MVC3.0简单应用,应用到的技术有Ef.Lambda.Linq.Interface.T4等. 由于网上对涉及到的技术 ...

  2. Vue.js 框架基础笔记

    Vue.js 框架基础笔记 1. Vue.js 基本概念 1.1 遇见 Vue.js 1.1.1 为什么要学习 Vue.js 1.1.2 前端开发的复杂化 1.1.3 Vue.js 特点 1.1.4 ...

  3. ASP.NET MVC+EF框架+EasyUI实现权限管理系列(13)-权限设计

    原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(13)-权限设计 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇)   (1):框架搭建    (2):数据 ...

  4. ASP.NET MVC+EF框架+EasyUI实现权限管理(附源码)

    前言目录 前言:时间很快,已经快到春节的时间了,这段时间由于生病,博客基本没更新,所以今天写一下我们做的一个项目吧,是对权限的基本操作的操作,代码也就不怎么说了,直接上传源码和图片展示,下面我们直接进 ...

  5. data spring 指定时区_Spring 框架基础(05):Mvc架构模式,执行流程详解

    本文源码:GitHub || GitEE 一.SpringMvc框架简介 1.Mvc设计理念 MVC是一种软件设计典范,用一种业务逻辑.数据.界面显示分离的方法组织代码,将业务逻辑聚集到一个组件里面, ...

  6. ASP.NET MVC+EF框架+EasyUI实现权限管理系列(14)-主框架搭建

    ASP.NET MVC+EF框架+EasyUI实现权限管理系列(14)-主框架搭建 原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(14)-主框架搭建    ASP.NET MV ...

  7. ASP.NET MVC+EF框架+EasyUI实现权限管理系列(18)-过滤器的使用和批量删除数据(伪删除和直接删除)...

    ASP.NET MVC+EF框架+EasyUI实现权限管理系列(18)-过滤器的使用和批量删除数据(伪删除和直接删除) 原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(18)-过 ...

  8. ASP.NET MVC+EF框架+EasyUI实现权限管理系列(17)-注册用户功能的细节处理(各种验证)...

    原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(17)-注册用户功能的细节处理(各种验证) ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇)   (1):框 ...

  9. MVC实战之排球计分(六)—— 使用EF框架,创建Controller,生成数据库。

    在上篇博客我们写到,此软件的数据库连接我们使用的是EF框架,code first模式下, 通过模型类,在创建controller的时候直接生成数据库,完成数据库的连接,与操作. 在使用EF框架之前,我 ...

最新文章

  1. java irowset行数,Java CloneableRecord.put方法代码示例
  2. Oracle 检索数据
  3. 小而美的个人博客——前端——tags
  4. [C++11]继承构造函数
  5. springboot中service层注入的是实现类,但Controller层接收的是接口
  6. python设计模式7-桥接模式
  7. antd checkbox 默认选中_antd + select 默认选中问题?
  8. 字节跳动面试:kafka配置参数
  9. python里氏替换原则_php设计模式的六大原则(三):里氏替换原则
  10. 树莓派和机器人有啥关系(也有jetson tx2的知识主要)
  11. “泰迪杯”挑战赛 - 基于协同过滤的推荐算法研究与 GUI 设计
  12. java单线程爬虫使用Jsoup爬取bt磁力链接
  13. linux可执行文件的后缀是什么?
  14. SVN下载 1.11.0版本 win7 32位 安装文件及中文语言包
  15. Thinkphp聊天室H5实时聊天室群聊聊天室自动分配账户完群组私聊禁言等功能全开源运营版本
  16. MAC系统中安装labelme
  17. Twitter群推王:推特全方位营销利器
  18. Redis Cluster集群搭建
  19. vue 修改标题栏_在Vue中如何实现动态修改页面title
  20. 微信小程序的版本更新机制是什么?

热门文章

  1. 解决AndroidStudio 控制台编译输出中文乱码,黑方块+问号之类的
  2. 游戏编程入门(18):使用闪屏增添游戏的活力
  3. netcore 使用NHibernate
  4. bat批量提取word文件名
  5. 【论文-笔记】海防雷达仿真系统中PPI的设计与实现
  6. foobar2k折腾窗口中显示歌词
  7. file mask 是什么idea 配置file mask​html include
  8. x波段微带带通hairpin滤波器的历史
  9. Fluke Corporation收购工业可靠性领导者普卢福
  10. 使用七牛云进行文件上传