C# EF框架基础(非MVC)使用笔记

版权声明:尊重原创,转载请附本文链接。谢谢合作! https://blog.csdn.net/DeMonliuhui/article/details/82909691

什么是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 "删除成功!";
        }
展开阅读全文

没有更多推荐了,返回首页