一.创建实体类与映射类

  通过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. webapi使用autofac

    注意:您的项目中如果使用的是webapi2,此处必须为webapi2而不是webapi,否则在运行时将出现“重写成员“Autofac.Integration.WebApi.AutofacWebApiD ...

  2. Consul&Nginx&Registrator&ConsulTemplate部署高可用负载均衡

    1. Consul Server 创建consul server虚拟主机 docker-machine create consul 出现如下内容即创建成功 Running pre-create che ...

  3. 【ubuntu】软件安装与apt-get下载软件的存放位置

    系统:Ubuntu16.04 常用的软件安装方式有两种: 第一种:apt-get(安装后略类似于windows中的安装版软件): 例:apt-get install ssh 1.下载的软件存放位置 / ...

  4. PATB 1028. 人口普查(20)

    1028. 人口普查(20) 注意特判合理人数为0,否则格式错误.很暴力的sort排序找出最大最小. 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Stan ...

  5. 使用new新建动态二维数组(多注意)

    #include<iostream> using namespace std; int main() { //设想要建立一个rows行,cols列的矩阵 //使用new进行新建 int r ...

  6. Web自动化测试 二 ----- HTML

    HTML 一.结构 html> 与 </html> 之间的文本描述网页 <body> 与 </body> 之间的文本是可见的页面内容 <h1> 与 ...

  7. GIT \ SVN 版本管理 git + gitHub

    场景1   想删除一个段落,又怕将来想恢复找不回来怎么办?有办法,先把当前文件"另存为--"一个新的Word文件,再接着改,改到一定程度,再"另存为--"一个新 ...

  8. python 查询 elasticsearch 常用方法(Query DSL)

    1. 建立连接 from elasticsearch import Elasticsearch es = Elasticsearch(["localhost:9200"]) 2. ...

  9. input的值为浅淡样式(点击值消失)

    <input type="text" id="leftSearchValue" value="" placeholder=" ...

  10. 4.秋招复习简单整理之java支持多继承吗?

    java仅支持单继承,但支持接口多实现.