EF Core的Code First 基础
一.创建实体类与映射类
通过NuGet引用Microsoft.EntityFrameworkCore
1.创建实体类
Code First可以通过为实体类字段添加相应特性,来创建对应的字段类型等,举例如下。
- [Table]:表名称
- [Key]:表主键
- [Column("F_ENCODE", TypeName = "varchar(200)")]:表字段名称和类型
- [MaxLength]:字符串长度
- [ForeignKey:表外键约束
- [NotMapped]:排除该字段,在更新添加时排除
- [Required]:非空
但是优先级低于Fluent API 的配置。
创建实体类,如下:
[Table("BASE_COMPANY")]
public class CompanyEntity
{
#region 实体成员
/// <summary>
/// 公司主键
/// </summary>
/// <returns></returns>
[Key]
[Column("F_COMPANYID")]
public string F_CompanyId { get; set; }
/// <summary>
/// 公司代码
/// </summary>
/// <returns></returns>
[Column("F_ENCODE", TypeName = "varchar(200)"),Required]
public string F_EnCode { get; set; }
//此处省略。。。。。
}
2.创建映射类
为每个实体类创建映射类并继承泛型接口IEntityTypeConfiguration<T>,需要实现方法Configure(EntityTypeBuilder<T> builder),通过这个方法可以对每个字段进行主键、类型等配置属于Fluent API,所以会覆盖特性配置。
public class CompanyMap : IEntityTypeConfiguration<CompanyEntity>
{
public void Configure(EntityTypeBuilder<CompanyEntity> builder)
{
builder.Property(o => o.F_EnCode).HasMaxLength();
builder.Property(o => o.F_CompanyId).HasMaxLength();
}
}
二、创建派生上下文
1、通过NuGet引用Microsoft.EntityFrameworkCore和Microsoft.EntityFrameworkCore.SqlServer(使用SqlServer数据库,其他数据库引用相应程序包)。
2、创建继承DbContext的派生上下文,重写方法OnConfiguring(DbContextOptionsBuilder optionsBuilder)和OnModelCreating(ModelBuilder modelBuilder)。
OnConfiguring:可以配置数据库连接语句、超时重连策略、DbContext行为选择器是否跟踪等。
OnModelCreating:通过Fluent API配置每个实体类的字段,或者加载需要映射的实体类。
3、另外可以通过构造函数传入数据库连接的配置,效果同OnConfiguring是一样的。
此处通过反射动态加载继承IEntityTypeConfiguration<T>实体映射类型
public class DataBaseContext : DbContext
{
public DataBaseContext(DbContextOptions dbContextOptions) : base(dbContextOptions) { } /// <summary>
/// 数据库链接配置
/// </summary>
/// <param name="optionsBuilder"></param>
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
if (!optionsBuilder.IsConfigured)
{
//Add - Migration Init //其中Init是你的版本名称
//update - database Init //更新数据库操作 init为版本名称
optionsBuilder.UseSqlServer(Config.Get("ConnectionStrings:BaseDb:ConnectionString"), option => option.UseRowNumberForPaging());
}
} /// <summary>
/// 模型创建重载
/// </summary>
/// <remarks>
/// 重写DbContext默认的OnModelCreating方法,使用自定义的方法动态加载实体映射类型
/// </remarks>
/// <param name="modelBuilder">模型创建器</param>
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
// 通过反射获取继承IEntityTypeConfiguration的实体类型
string assembleFileName = Assembly.GetExecutingAssembly().CodeBase.Replace("Capricorn.Db.SqlServer.dll", "Capricorn.Entity.Mapping.dll").Replace("file:///", "");
Assembly asm = Assembly.LoadFile(assembleFileName);
var configurationTypes = asm.GetTypes()
.Where(type => !string.IsNullOrWhiteSpace(type.Namespace))
.Where(type => type.GetTypeInfo().IsClass)
.Where(type => type.GetTypeInfo().BaseType != null)
.Where(type => type.GetInterfaces().Where(o => o.Name == typeof(IEntityTypeConfiguration<>).Name).Count() != )
.ToList();
// 实例化实体类加入模型创建器
foreach (var type in configurationTypes)
{
dynamic obj = Activator.CreateInstance(type);
modelBuilder.ApplyConfiguration(obj);
}
base.OnModelCreating(modelBuilder);
}
}
三、通过程序包管理器控制台指令创建更新数据库
add-migration Init 其中Init是你的版本名称,执行之后会生成如下文件:

update-database Init 更新数据库操作 init为版本名称,执行指定的版本会生成或更新数据库的表、表字段、主外键关系等。
需要注意通过程序包管理器控制台输入指令前需要将默认项目选择为派生上下文所在的项目。

并且在Startup.cs的ConfigureServices中初始化数据库上下文。
//初始化数据库上下文
services.AddDbContext<DataBaseContext>();
四、基础增删查改
由于上面我们将数据库上下文初始化在了Startup.cs中,所以可以用依赖注入的方式获取数据库实例:
private DataBaseContext context;
public HomeController(DataBaseContext _context)
{
this.context = _context;
}
1、查询
我们采用了通过反射动态映射实体类的方式,所以无法使用一般的直接context.CompanyEntity的这种方式直接查询,需要通过context.Set<T>()。
获取列表
var list = context.Set<CompanyEntity>().Where(o => o.F_CompanyId == "").ToList();
通过主键获取实体
var entity = context.Set<CompanyEntity>().Find("");
加载单个实体
var entity = context.Set<CompanyEntity>().Single(o => o.F_CompanyId == "");
2.删除
CompanyEntity entity = context.Set<CompanyEntity>().Find("");
context.Set<CompanyEntity>().Attach(entity);
context.Set<CompanyEntity>().Remove(entity);
context.SaveChanges();
3.添加
CompanyEntity entity = new CompanyEntity()
{
F_CompanyId = "",
F_EnCode = ""
};
context.Set<CompanyEntity>().Attach(entity);
context.Set<CompanyEntity>().Add(entity);
context.SaveChanges();
4.更新
CompanyEntity entity = new CompanyEntity()
{
F_CompanyId = "",
F_EnCode = ""
};
context.Set<CompanyEntity>().Attach(entity);
context.Set<CompanyEntity>().Update(entity);
context.SaveChanges();
5.执行原始SQL语句
CompanyEntity entity = context.Set<CompanyEntity>().FromSql("select * from BASE_COMPANY").First();
五、结束语
其实EF Core的使用非常的灵活可以有很多种不同的方式,我这里只是其中一种,大家可以可以选择自己喜欢的方式。
EF Core的Code First 基础的更多相关文章
- C# 嵌入dll 动软代码生成器基础使用 系统缓存全解析 .NET开发中的事务处理大比拼 C#之数据类型学习 【基于EF Core的Code First模式的DotNetCore快速开发框架】完成对DB First代码生成的支持 基于EF Core的Code First模式的DotNetCore快速开发框架 【懒人有道】在asp.net core中实现程序集注入
C# 嵌入dll 在很多时候我们在生成C#exe文件时,如果在工程里调用了dll文件时,那么如果不加以处理的话在生成的exe文件运行时需要连同这个dll一起转移,相比于一个单独干净的exe,这种形 ...
- EF Core 的 Code First 模式
0 前言 本文正文第一节,会对 Code First 进行基本的介绍,以及对相关名词进行说明,读者一开始可以不用在这里消耗过多时间,可以先操作一遍例子,再回过头理解. 第二节,以一个简单的例子,展示 ...
- 基于EF Core的Code First模式的DotNetCore快速开发框架
前言 最近接了几个小单子,因为是小单子,项目规模都比较小,业务相对来说,也比较简单.所以在选择架构的时候,考虑到效率方面的因素,就采取了asp.net+entity framework中的code f ...
- 【基于EF Core的Code First模式的DotNetCore快速开发框架】完成对DB First代码生成的支持
前言 距离上一篇文章<基于EF Core的Code First模式的DotNetCore快速开发框架>已过去大半个年头,时光荏苒,岁月如梭...比较尴尬的是,在这大半个年头里,除了日常带娃 ...
- EF Core学习Code First
下面通过实例来学习EF Core Code First,也就是通过EF Core迁移来完成从模型生成数据库. 本实例使用EntityFrameworkCore SQLite 数据库进行介绍,大家也可以 ...
- NET Core 使用EF Core的Code First迁移和DBFirst
DBFirst (1)Microsoft.EntityFrameworkCore (2)Microsoft.EntityFrameworkCore.Design (3)Microsoft.Entity ...
- EF core (code first) 通过自定义 Migration History 实现多租户使用同一数据库时更新数据库结构
前言 写这篇文章的原因,其实由于我写EF core 实现多租户的时候,遇到的问题. 具体文章的链接: Asp.net core下利用EF core实现从数据实现多租户(1) Asp.net core下 ...
- EF core (code first) 通过自动迁移实现多租户数据分离 :按Schema分离数据
前言 本文是多租户系列文章的附加操作文章,如果想查看系列中的其他文章请查看下列文章 主线文章 Asp.net core下利用EF core实现从数据实现多租户(1) Asp.net core下利用EF ...
- Entity Framework (EF) Core工具创建一对多和多对多的关系
一. EntirtyFramework(EF)简介 EntirtyFramework框架是一个轻量级的可扩展版本的流行实体框架数据访问技术,微软官方提供的ORM工具让开发人员节省数据库访问的代码时间 ...
随机推荐
- sql server编写简洁四则运算表达式脚本实现计算批次功能(C#等其它编程语言也能直接用此通用表达式)
问题: 在数据库编程开发中,有时会遇到数据量比较大的情况,如果直接大批量进行添加数据.修改数据.删除数据,就会是比较大的事务,事务日志也比较大,耗时久的话会对正常操作造成一定的阻塞.虽不至于达到删库跑 ...
- 深入V8引擎-AST(3)
上篇简单介绍了入口方法的流程以及scanner类相关的部分内容,这一篇主要讲scanner的初始化,即 scanner_.Initialize(); 注意,这不是调用静态方法.实际上Parser实例生 ...
- 【SQL-JOIN】mysql中left joinn、right join、full join以及inner join
看到这两张图的时候就觉得太棒了,年轻的时候曾经爬了好多坑~~~~~~
- 39 | 从小作坊到工厂:什么是Selenium Grid?如何搭建Selenium Grid?
- 100天搞定机器学习|Day2简单线性回归分析
第一天机器学习100天|Day1数据预处理,我们学习了数据预处理.知道了,数据预处理是机器学习中最基础和最麻烦,未来占用时间最长的一步操作.数据预处理一般有六个步骤,导入库.导入数据集.处理缺失值.分 ...
- Python之Pandas库学习(一):简介
官方文档 1. 安装Pandas windos下cmd:pip install pandas 导入pandas包:import pandas as pd 2. Series对象 带索引的一维数组 创建 ...
- tensorflow学习笔记(1)-环境配置
配置环境anaconda3+windows10+pycharm+python==3.5.2+tensorflow==1.1.4+cuda10.0+cudnn7 https://www.anaconda ...
- 小代学Spring Boot之开篇
想要获取更多文章可以访问我的博客 - 代码无止境. 前情提要 小代是一名入职不久的程序员,公司同事都亲切的称他小代.有一天小代的老大陈BOSS和小代说,公司后端最近准备换技术框架了. 小代: 换成啥? ...
- JavaScript 之迭代方法
前言:关于 JS 中为数组定义的迭代方法,我最开始是在<JavaScript高级程序设计>中学习的,然后...我并没有看懂,后来翻阅各个大佬的博客,稍微理解了那么一丢丢.以下就是我的一点见 ...
- python文件下载
1. 场景描述 刚好总结Java项目的web文件下载(附方案及源码配置),想起python项目也有用到文件下载,就也介绍下吧. 2. 解决方案 使用python的第三方组件Flask来实现文件下载功能 ...