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工具让开发人员节省数据库访问的代码时间 ...
随机推荐
- 解决wireshark打开错误
错误提示如下: Lua: Error during loading: [string "/usr/share/wireshark/init.lua"]:44: dofile has ...
- 球体的双目视觉定位(matlab,附代码)
球体的双目视觉定位(matlab,附代码) 标签(空格分隔): 机器视觉 引言 双目视觉定位是我们的一个课程设计,最近刚做完,拿出来与大家分享一下,实验的目的是在拍摄的照片中识别球体,并求出该球体到相 ...
- 28个Java开发常用规范技巧总结
1.类的命名使用驼峰式命名的规范. 例如:UserService,但是以下情景例外:DO / BO / PO / DTO / VO. 例如说:UserPO,StudentPO(PO,VO,DTO,等这 ...
- CSS3边框与圆角
1. CSS3 圆角 border-radius 属性 一个最多可指定四个border -*- radius属性的复合属性,这个属性允许你为元素添加圆角边框!语法:border-radius: 1-4 ...
- spring源码深度解析— IOC 之 循环依赖处理
什么是循环依赖 循环依赖其实就是循环引用,也就是两个或则两个以上的bean互相持有对方,最终形成闭环.比如A依赖于B,B依赖于C,C又依赖于A.如下图所示: 注意,这里不是函数的循环调用,是对象的相互 ...
- Oracle数据库常用脚本命令(二)
--创建学生信息表create table student( sid number(8,0), name varchar2(20), sex char(2), birthday date, addre ...
- 广告过滤器 Adguard Pre v6.4.1814 Lite V2 简约绿色版
下载地址:点我 基本介绍 当你在浏览网页的时候总是弹出广告是不是非常的不爽,小编为伙伴们提供了Adguard Pre简约绿色版,一款专业的广告过滤器.Adguard Pre简约绿色版可以帮助伙伴们完美 ...
- .Net Core 使用百度UEditor编辑器
一.准备文件 1. 下载UEditor官方版本.删除其中后端文件.保留后端文件夹中的config.json文件 2. 在NuGet管理器中搜索UEditorNetCore,拿到项目地址,下载源码 下载 ...
- Bzoj 1537: [POI2005]Aut- The Bus 题解 [由暴力到正解]
1537: [POI2005]Aut- The Bus Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 387 Solved: 264[Submit][S ...
- [NOI2014]魔法森林题解
这道题正解其实是LCT,然而貌似SPFA也可以成功水过,所以根本不知道LCT的我只能说SPFA了. 这道题最大的限制是两种精灵就意味着一条道可能有两个权值,因此我们需要去将其中一个固定,然后再推另一个 ...