物理框架ado.netentityframework(ef )一组技术,支持面向数据的软件APP应用程序开发。 允许开发人员使用映射到数据源的逻辑架构的概念模型。
另一方面,右键单击要构建EF框架的1.BLL (业务层)、2.DAL (模型)、物理层)解决方案,选择【添加项目】,添加所有三个项目
)1) 3层间引用关系如下:
a.DAL参照模型
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 (数据库优先)进行连接。 这里是代码优先)代码优先)框架。 这不需要自己写数据库
)1)在已配置EF框架的前提下使用,操作如下。 在此,建议查看)的操作。 本)的操作只是基本的理解。
单击“添加”,然后继续
单击空的EF模型,然后单击“完成”进入下一步
然后用Model配置数据库。 dessed是一个表,但写入数据库后,最后添加s或es。
然后,需要在App.config中配置用于读取数据库的data source=localhost等,并添加和保存数据库。
)2)添加基于数据库创建的Code First模型(本项目主要使用此模型)。
单击“下一步”继续
单击“下一步”继续
选中表,确认单个或多个,然后单击“完成”。
在此过程中,会自动导入以前创建的表关系,并在Model类中自动创建表之间的关系。
再说一遍,
2 .使用基于数据库的Code First模型的EF框架存在需要理解和注意的问题。 1 .即时加载、延迟加载、显式加载
(1)立即加载:
有什么好处:如果一次加载,以后可以从cache读取。 或减少对数据库的访问次数。
)2)延迟加载)增加了数据库压力,只在你需要此数据时加载。 数据量大的情况。
树结构,树菜单。
默认情况下,推迟加载。 如何关闭延迟加载? 显示加载?
很容易理解这一点,是否与以后的树结构、树菜单、树结构有关,是否需要更改,通常不需要。
2 .数据库为我们提供的战略
(1) CreateDatabaseIfnotExists 。 【默认数据库策略】
a .数据库不存在。 创建数据库。
b.model修正,执行慢速异常
)2) dropcreatedatabaseifmodelchanges【修改模型后执行drop数据库操作】
缺点:如果有原始数据,很抱歉,数据会消失。
(3) DropCreateDatabaseAlways一直是重建操作。
3 .迁移【数据迁移】=解决了数据丢失问题。 迁移_历史.
(1)在nuget控制台中,输入(enable-migrations-enableautomaticmigration:$ true )将配置文件添加到confiration
输入命令后,会出现Migrations文件夹
Configuration中的第二行=true是由于具有默认删除表的结构而导致的数据丢失,可以执行此操作
)2)在dbcontext构造函数中注入“数据库初始化方法”
//Database.SetIn
itializer(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框架的数据库操作方法。