Entity Framework 三种编码方式
概述
在开发面向数据的软件时我们常常为了解决业务问题实体、关系和逻辑构建模型而费尽心机,ORM的产生为我们提供了一种优雅的解决方案。ADO.NET Entity Framework是.NET开发中一种由ADO.NET驱动的ORM框架,使用Entity Framework开发人员可以不必考虑数据的基础数据表和列,在处理数据时能够以更高的抽象级别进行工作,并能够以相对传统开发编写更少的代码来创建和维护应用程序。
我们知道面向对象的编程与数据存储系统的交换提出了一个难题:类结构通常同关系数据表组织结构相近但又不同。例如数据中可能使用一个外键表示一个实体与另一个实体的关系,但是对于类而言我们通知会在类中定义一个属性来描述这种关系。对于这个问题当前ORM框架一般选择通过将面向对象的类和属性映射到关系表和列来弥补这种不足。但是Entity Framework并没有采取这种方式而是将逻辑模型中的表、列和外键约束映射到概念模型中的实体和关系,实体数据模型工具再基于概念模型生成可扩展的数据类。这些类派生自基类,而基类提供服务以将实体具体化为对象并进行跟踪和保存。这样一来开发人员不仅可以很方便的对数据类进行扩展而且可以像处理关联对象一样处理实体和关系。
Database First
“Database First”模式我们称之为“数据库优先”,前提是你的应用已经有相应的数据库,你可以使用EF设计工具根据数据库生成数据数据类,你可以使用Visual Studio模型设计器修改这些模型之间对应关系。
Model First
Model First我们称之为“模型优先”,这里的模型指的是“ADO.NET Entity Framework Data Model”,此时你的应用并没有设计相关数据库,在Visual Studio中我们通过设计对于的数据模型来生成数据库和数据类。
Code First
Code First模式我们称之为“代码优先”模式,是从EF4.1开始新建加入的功能。使用Code First模式进行EF开发时开发人员只需要编写对应的数据类(其实就是领域模型的实现过程),然后自动生成数据库。这样设计的好处在于我们可以针对概念模型进行所有数据操作而不必关系数据的存储关系,使我们可以更加自然的采用面向对象的方式进行面向数据的应用程序开发。
从某种角度来看,其实“Code First”和“Model First”区别并不是太明显,只是它不借助于实体数据模型设计器,而是直接通过编码(数据类)方式设计实体模型(这也是为什么最开始“Code First”被叫做“Code Only”的原因)。但是对于EF它的处理过程有所差别,例如我们使用Code First就不再需要EDM文件,所有的映射通过“数据注释”和“fluent API”进行映射和配置。另外需要注意的是“Code First”并不代表一定就必须通过数据类来定义模型,事实上也可以通过现有数据库生成数据类。
具体的使用方式可参考:https://www.cnblogs.com/kenshincui/p/3280742.html#autoid-0-0-0
记录两种code first反向生成数据库的实例
- EF Code First反向生成数据库的实例(.net framework)
- EF Code First反向生成数据库的实例(.net core)
下面介绍EF Code First反向生成数据库的实例(.net framework)
1、创建一个asp.net api项目,创建一个Models类库,并安装以下包
(安装EntityFramework包时会自动装EntityFramework.SqlServer的包)
2、在Models添加班级和学生类
public class BaseEntity
{
/// <summary>
/// 是否删除
/// </summary>
public bool IsDeleted { get; set; }
}
//班级类
public class Class : BaseEntity
{
public int Id { get; set; }
public string ClassName { get; set; }
}
//学生类
public class Student: BaseEntity
{
public int StuId { get; set; }
public string StuName { get; set; }
public int ClassId { get; set; }
public Class Class{ get; set; }
}
3、创建DbContext数据库上下文类
public partial class DbWrongBooksContext : DbContext
{
public DbWrongBooksContext() : base("name=DbWrongBooksContext")
{
this.Configuration.LazyLoadingEnabled = false;
}
public DbSet<Class> Class { get; set; }
public DbSet<Student> Student{ get; set; }
protected override void OnModelCreating(DbModelBuilder mb)
{
Database.SetInitializer<DbWrongBooksContext>(null);
//增加全局数据过滤,只查询IsDeleted为false的数据,需要安装包EntityFramework.DynamicFilters
mb.Filter("IsDeleted", (BaseEntity x) => x.IsDeleted, false);
//数据表
mb.Entity<Class>().ToTable("Class");
mb.Entity<Student>().ToTable("Student");
//关系索引
//mb.Entity<User>()
// .HasMany(x => x.Roles)
// .WithMany(x => x.Users)
// .Map(m =>
// {
// m.ToTable("UserRole"); //中间关系表表名
// m.MapLeftKey("UserId"); //在中间表主键名
// m.MapRightKey("RoleId"); //在中间表主键名
// });
}
}
4、在web.config配置文件添加数据库连接字符串
<connectionStrings> <add name="YYTestDbContext" connectionString="Data Source=链接地址;Initial Catalog=数据库名;User=用户;Password=密码" providerName="System.Data.SqlClient"/> </connectionStrings>
5、打开程序包管理器控制台
5.2 默认项目选中到Models,设置启动项目为TeacherResoreceWeb
5.3 在弹出的控制台界面输入Enable-Migrations命令,如果项目中出现Migrations文件夹,则Migration启用成功
5.4 添加种子数据
种子数据添加在Configuration.cs文件 Seed方法中
5.5 在弹出的控制台界面输入Add-Migration v1.0,添加新的Migration,v1.0为自定义名称。
Add执行成功后会生成问一个v1.0的文件,成功后输入update-database命令会直接创建、更新数据库
EF Code First反向生成数据库的实例(.net core)
1、我创建了一个asp.net core web项目,添加Model类库新增Student类,并安装引用以下包
(使用数据库迁移功能需要安装包Microsoft.EntityFrameworkCore.Tools)
2、创建DbContext数据库上下文
public class testDbContext : DbContext { public testDbContext(DbContextOptions<testDbContext> options) : base(options) { } public DbSet<Student> Student { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Student>().ToTable("Student"); } }
3、appsettings.json 配置数据库连接字符串
3、注入
4、打开程序包管理器控制台,具体步骤参考上面
}