实体框架ADO.NET Entity Framework(EF)一套支持面向数据的软件应用程序开发的技术,它可让开发人员使用映射到数据源中的逻辑架构的概念模型。

一.搭建EF框架

1.BLL(业务层)、2.DAL(数据层)、3.Model(实体层)

在解决方案上操作右键,选择【添加项目】,把3个项目都添加进去

ef架构教程视频 ef框架使用_EF

ef架构教程视频 ef框架使用_ef架构教程视频_02

(1)3层间得引用关系如下:

   a. DAL 引用 Model

   b.BLL 引用 DAL 和 Model

   c.创建的 ASP.NET MVC 项目引用 BLL 和 Model

(2)引用方法:在对应的项目上操作右键,选择【引用】(也可直接在项目中的“引用”上操作右键)

2.下载EF插件

ef架构教程视频 ef框架使用_ef架构教程视频_03

点击管理NuGet程序包,

ef架构教程视频 ef框架使用_数据库_04

下载成功之后连接数据库

3.添加实体数据模型,

使用EF进行数据库开发的时候有两个步骤需要创建:一个是数据库,另一个是模型类。根据这两种创建的先后顺序有EF的三种创建办法:

a).DataBase First(数据库优先):先创建数据库表,然后自动生成EDM文件,EDM文件生成模型类。

b).Model First(模型优先):先创建Edm文件,Edm文件自动生成模型类和数据库

c).Code First(代码优先):自己写模型类,然后自动生成数据库。没有Edm文件。
DataBase First简单、方便,但是当项目打了之后会非常痛苦;Code First入门门槛高,但是适合大项目。虽然有三种创建方法,一旦创建好了数据库、模型类之后,后面的用法都是一样的。业界推荐使用Code First,新版的EF中只支持Code irst,所以在以后的使用中,就按照Code First的方法创建使用EF。

使用DataBase First(数据库优先)连接也行,这里使用Code First(代码优先)框架,这个不需要自己写数据库

(1)在已经配置好EF框架的前提下使用,操作如下,这里建议看(2)的操作,本(1)的操作只是基本的了解。

ef架构教程视频 ef框架使用_Code_05

点击添加,下一步

ef架构教程视频 ef框架使用_ef架构教程视频_06

点击空的EF模型,然后点击完成,下一步

ef架构教程视频 ef框架使用_数据库_07

然后在Model中配置数据库, dessed就是一个表,但是它写入数据库后会在结尾加s或者es。

ef架构教程视频 ef框架使用_EF_08

然后App.config中需要配置读取数据库的data source=localhost等等,然后就是添加数据库保存。

 

(2)添加基于数据库创建的Code First模型(本项目主要还是用的这个)

ef架构教程视频 ef框架使用_ef架构教程视频_09

点击下一步 ,继续

ef架构教程视频 ef框架使用_数据库_10

点击下一步,继续

ef架构教程视频 ef框架使用_Code_11

 勾选表和确认单复数,点击完成。

在此处会自动导入之前已经建立好的表关系,并且会自动在Model类中,自动建立好表之间的关系,

下面再说一下,

二.使用基于数据库的Code First模型的EF框架需要了解和注意的相关问题。

1.立即加载,延迟加载,显式加载
(1)立即加载:
有什么好处:如果一次性加载出来,可以后续从cache中读取。。。或者减少数据库的访问次数。。。
(2)延迟加载:增加了数据库的压力,,,只有你需要这条数据的时候我们才加载,如果数据量比较大。。。
    Tree结构,树形菜单。
    默认情况下我们就是延迟加载。。。如何关闭延迟加载??显示加载?
上面这个简单了解一下,看看与后面的Tree结构,树形菜单,树形结构有没有关系,需不需要更改,正常情况下是不需要。
2.数据库给我们提供了哪些策略
(1)CreateDatabaseIfnotExists。。。【默认的数据库策略】
       a.数据库不存在,创建数据库。。
       b.model修改,执行抛出异常
(2)DropCreateDatabaseIfModelChanges【model一旦修改,我们将会执行dropdatabase操作】
     缺点:一旦有原始数据,那么对不起,数据都没有了。
(3)DropCreateDatabaseAlways    一直都是rebuild操作。。。

3.migration【数据迁移】=>解决了数据丢失的问题。

migration_history...
(1)在nuget控制台上键入:enable-migrations -EnableAutomaticMigration:$true  来增加一个confiration的一个配置文件

ef架构教程视频 ef框架使用_EF_12

输入命令之后,会出现Migrations的文件夹

ef架构教程视频 ef框架使用_ef架构教程视频_13

Configuration中第二行=true,就是默认删除表的某一构造造成的数据丢失,这一操作,允许执行

ef架构教程视频 ef框架使用_Code_14

(2)在dbcontext构造函数中注入“数据库初始化方式”
  //Database.SetInitializer(new MigrateDatabaseToLatestVersion<Model1, Migrations.Configuration>("Model1"));
(3)改一下db的名字,因为第一次使用codefirst的话,我们并没有db存在。(就是在App.config中改变数据库的名字,重新命名一个数据库)
(4)执行savechange操作
 4.如何做到修改domain不做dropdatabase的操作
  (1).add column的操作

       理想情况下,表中的记录还在,同时表中会增加一个新的column
2. remove column操作             SchoolDB2数据库
    会存在一个数据的那要删除的一列丢失的问题。。
    默认情况下,这种危险的操作ef是否默认放行呢???
    ef必须让我们显示指定,否则不给放行。。。

下面这个截图是单独的补充之前的,可以看看,学习视频,推荐:https://www.bilibili.com/video/BV187411m7DD

public class Model1 : DbContext
    {
        //您的上下文已配置为从您的应用程序的配置文件(App.config 或 Web.config)
        //使用“Model1”连接字符串。默认情况下,此连接字符串针对您的 LocalDb 实例上的
        //“DAL.Model1”数据库。
        //如果您想要针对其他数据库和/或数据库提供程序,请在应用程序配置文件中修改“Model1”
        //连接字符串。
        public Model1()
            : base("name=Model1")   //("data source=localhost;initial catalog=ceshi;integrated security=True")  
        {
            //model一旦修改,db进行rebuild
            //Database.SetInitializer<Model1>(new DropCreateDatabaseIfModelChanges<Model1>());
            //Database.SetInitializer(new MigrateDatabaseToLatestVersion<Model1, Migrations.Configuration>("Model1"));
        }
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Student>()
                //.ToTable("sss")   修改表名
                .Property(e => e.StudentName)   //选择表中的某一个字段变量,进行配置
                .IsUnicode(false)               //指定该字段不支持Unicode字符串的内容
                ;
            base.OnModelCreating(modelBuilder);
        }
        //为您要在模型中包含的每种实体类型都添加 DbSet。有关配置和使用 Code First  模型
        //的详细信息,请参阅 http://go.microsoft.com/fwlink/?LinkId=390109。
        public virtual DbSet<dessed> de { get; set; }   
        public virtual DbSet<aoe> ddd { get; set; }
        public virtual DbSet<Student>Students { get; set; }
        public virtual DbSet<StudentAddress> StudentAddresses { get; set; }

    }

之后的操作请看基于EF框架的数据库操作方法