实体框架ADO.NET Entity Framework(EF)一套支持面向数据的软件应用程序开发的技术,它可让开发人员使用映射到数据源中的逻辑架构的概念模型。
一.搭建EF框架
1.BLL(业务层)、2.DAL(数据层)、3.Model(实体层)
在解决方案上操作右键,选择【添加项目】,把3个项目都添加进去
(1)3层间得引用关系如下:
a. DAL 引用 Model
b.BLL 引用 DAL 和 Model
c.创建的 ASP.NET MVC 项目引用 BLL 和 Model
(2)引用方法:在对应的项目上操作右键,选择【引用】(也可直接在项目中的“引用”上操作右键)
2.下载EF插件
点击管理NuGet程序包,
下载成功之后连接数据库
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模型,然后点击完成,下一步
然后在Model中配置数据库, dessed就是一个表,但是它写入数据库后会在结尾加s或者es。
然后App.config中需要配置读取数据库的data source=localhost等等,然后就是添加数据库保存。
(2)添加基于数据库创建的Code First模型(本项目主要还是用的这个)
点击下一步 ,继续
点击下一步,继续
勾选表和确认单复数,点击完成。
在此处会自动导入之前已经建立好的表关系,并且会自动在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的一个配置文件
输入命令之后,会出现Migrations的文件夹
Configuration中第二行=true,就是默认删除表的某一构造造成的数据丢失,这一操作,允许执行
(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框架的数据库操作方法。