一.创建实体类与映射类

  通过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 基础的更多相关文章

  1. 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,这种形 ...

  2. EF Core 的 Code First 模式

    0 前言 本文正文第一节,会对 Code First 进行基本的介绍,以及对相关名词进行说明,读者一开始可以不用在这里消耗过多时间,可以先操作一遍例子,再回过头理解. 第二节,以一个简单的例子,展示 ...

  3. 基于EF Core的Code First模式的DotNetCore快速开发框架

    前言 最近接了几个小单子,因为是小单子,项目规模都比较小,业务相对来说,也比较简单.所以在选择架构的时候,考虑到效率方面的因素,就采取了asp.net+entity framework中的code f ...

  4. 【基于EF Core的Code First模式的DotNetCore快速开发框架】完成对DB First代码生成的支持

    前言 距离上一篇文章<基于EF Core的Code First模式的DotNetCore快速开发框架>已过去大半个年头,时光荏苒,岁月如梭...比较尴尬的是,在这大半个年头里,除了日常带娃 ...

  5. EF Core学习Code First

    下面通过实例来学习EF Core Code First,也就是通过EF Core迁移来完成从模型生成数据库. 本实例使用EntityFrameworkCore SQLite 数据库进行介绍,大家也可以 ...

  6. NET Core 使用EF Core的Code First迁移和DBFirst

    DBFirst (1)Microsoft.EntityFrameworkCore (2)Microsoft.EntityFrameworkCore.Design (3)Microsoft.Entity ...

  7. EF core (code first) 通过自定义 Migration History 实现多租户使用同一数据库时更新数据库结构

    前言 写这篇文章的原因,其实由于我写EF core 实现多租户的时候,遇到的问题. 具体文章的链接: Asp.net core下利用EF core实现从数据实现多租户(1) Asp.net core下 ...

  8. EF core (code first) 通过自动迁移实现多租户数据分离 :按Schema分离数据

    前言 本文是多租户系列文章的附加操作文章,如果想查看系列中的其他文章请查看下列文章 主线文章 Asp.net core下利用EF core实现从数据实现多租户(1) Asp.net core下利用EF ...

  9. Entity Framework (EF) Core工具创建一对多和多对多的关系

     一. EntirtyFramework(EF)简介 EntirtyFramework框架是一个轻量级的可扩展版本的流行实体框架数据访问技术,微软官方提供的ORM工具让开发人员节省数据库访问的代码时间 ...

随机推荐

  1. Git 备忘录

    整理了一下工作中常用的 Git 操作,持续更新中...   merge单个文件 例如 B分支想要合并A分支的某个文件 首先,我们切换到B分支  git checkout branch B 之后,我们c ...

  2. Python自学day-15

    一.防止页面变形 在改变浏览器大小时,可能会导致里面的元素变形(特别是用百分比设置的宽度). 那么,我们如何解决这个问题? 可以在最外层的元素(例如div)中,设置一个固定像素的宽度,例如: < ...

  3. Linux下,非Docker启动Elasticsearch 6.3.0,安装ik分词器插件,以及使用Kibana测试Elasticsearch,

    Linux下,非Docker启动Elasticsearch 6.3.0 查看java版本,需要1.8版本 java -version yum -y install java 创建用户,因为elasti ...

  4. Linux搭建DHCP服务器

    Linux搭建DHCP服务器   实验目标: 通过本实验掌握基于Linux的DHCP服务器搭建技能. 本实验包含内容为yum的认识与使用,磁盘挂载的概念与使用,DHCP原理及配置,systemctl服 ...

  5. 如何将 qsys 子模块设置为参数可调的方式给另外的qsys 调用

    Intel FPGA Quartus 软件中的 Qsys工具 也就是 Platform Designer 系统集成工具,可以 图形化界面操作 使用系统自带ip,自定义ip 系统自动生成 ip 间的连接 ...

  6. HDU 5792:World is Exploding(树状数组求逆序对)

    http://acm.hdu.edu.cn/showproblem.php?pid=5792 World is Exploding Problem Description   Given a sequ ...

  7. 【带着canvas去流浪(11)】Three.js入门学习笔记

    目录 一. 资料推荐及建议 二. Three.js中的基本概念 三.重点笔记 四.补充示例 示例代码托管在:http://www.github.com/dashnowords/blogs 博客园地址: ...

  8. Linux 终端连接工具 XShell v6.0.01 企业便携版

    NetSarang Xshell – 知名终端连接工具,非常强大的SSH远程终端客户端 ,非常好用的SSH终端管理器.Xshell功能超级强大,性能非常优秀,其特色功能支持多标签会话管理主机,支持远程 ...

  9. ServiceFabric极简文档-5.0 Service Fabric有状态与无状态

    Service Fabric 应用程序方案 2017/08/14 作者 Edward Chen Jack Zeng Azure Service Fabric提供了一个可靠而灵活的平台,可用于编写和运行 ...

  10. STM32F072从零配置工程-基于HAL库的串口UART中断配置

    先上一个采用串口直接传输的Demo: 此处的思路是完全采用HAL库来实现的,核心是运用HAL_UART_Transmit_IT和HAL_UART_Receive_IT两个函数来实现的,可以作为一个De ...