一.创建实体类与映射类

  通过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. 【多处摘抄】Tomcat监视与调优

    文章摘抄大量内容,已附上摘抄地址,未找到最初博文作者,在此对原作者表述感谢:    最近调整了公司的Web容器,然后把项目转移到了idea,并且重新分了包,我以前很多重复的东西整合了一下,但是最近线下 ...

  2. iOS13中presentViewController的问题

    iOS13中presentViewController的问题 更新了Xcode11.0 beta之后,在iOS13中运行代码发现presentViewController和之前弹出的样式不一样. 会出 ...

  3. Codeforces 781A:Andryusha and Colored Balloons(DFS染色)

    http://codeforces.com/contest/782/problem/C 题意:给一棵树染最少的颜色,使得相邻距离为2的点都是不同的颜色,问最少是多少种颜色并输出每个点的颜色. 思路:比 ...

  4. HDU 1811:Rank of Tetris(并查集+拓扑排序)

    http://acm.hdu.edu.cn/showproblem.php?pid=1811 Rank of Tetris Problem Description   自从Lele开发了Rating系 ...

  5. Codeforces 776D:The Door Problem(DFS染色)

    http://codeforces.com/problemset/problem/776/D 题意:有n个门,m个开关,每个门有一个当前的状态(0表示关闭,1表示打开),每个开关控制k个门,但是每个门 ...

  6. [转]iis部署php项目

    阅读目录 1.启动iis服务器 2.打开iis 3.创建网站 4.php设置 ①添加默认文档 ②处理程序映射 1.安装urlrewrite 2.使用URL重写 今天跟着学习了如何在IIS下部署php项 ...

  7. iOS组件化开发一pod库包含MRC的文件处理(五)

    在做项目的过程中,建立了一个私有pod库,在这个库中存在mrc类文件这个时候如果在使用了arc的工程中引用这个pod的工程中手动设置当然也可以就是费时费力.现在我们来看看如何在私有库配置文件里配置自动 ...

  8. C#中的委托和事件(上篇)

    每一个初学C#的程序猿,在刚刚碰到委托和事件的概念时,估计都是望而却步,茫然摸不到头脑的.百度一搜,关于概念介绍的文章大把大把的,当然也不乏深入浅出的好文章.可看完这些文章,大多数新手,估计也只是信心 ...

  9. html解析器:Html Agility Pack

    去掉注释.样式.和js代码: foreach(var script in doc.DocumentNode.Descendants("script").ToArray()) scr ...

  10. Jenkins+SVN+Maven+shell 自动化部署实践

      JAVA环境中利用Jenkins+svn+maven进行自动化部署实践   一. 前言2 1.介绍jenkins2 1.本地项目打包2 2.通过secureCRT工具,手动传输到服务器2 3.然后 ...