EFCore与之前的EF基本类似,区别在于配置的时候有一些差异;也取消了DB First和Model First,仅保留广泛使用的Code First模式;也不再支持LazyLoad。这里就感受一下其基本使用。

一、EFCore的基本使用
EFCore的Nuget包为Microsoft.EntityFrameworkCore,为了与Linux那边的Mysql连接还需安装provider,这里跟着安装了第三方的Pomelo.EntityFrameworkCore.Mysql。一开始不能用,后来发现两天前Pomelo刚刚发布了针对2.0的正式版,重新安装后就好了。
在mysql添加表,然后配置好DbContext,简易代码为:

public class MyDbContext : DbContext {
  public DbSet<Person> Persons { get; set; }

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) {
    base.OnConfiguring(optionsBuilder);
    optionsBuilder.UseMySql("Server=192.168.0.104;database=test1;uid=root;pwd=040207");
  }

protected override void OnModelCreating(ModelBuilder modelBuilder) {
    base.OnModelCreating(modelBuilder);
    var etPerson = modelBuilder.Entity<Person>();
    etPerson.ToTable("T_Persons");
  }
}

重写了OnConfiguring和OnModelCreating以设置数据库连接和映射表。这里也是和EF区别的地方,后者是在config文件中配置连接字符串的。而且EF是需要手动禁用自动创建表和Migration的,这儿却没有类似的代码,具体后面再学习,Code
First应该有这样的机制。
最后测试添加数据的代码写法与EF完全一致。
这次的C#代码采用了大括号不换行的风格,是因为发现这样的写法相对不占篇幅,而且便于作为文本复制。

二、一对多和多对多
a)一对多
比如一个Author对应多本Book:

//Book实体
public class Book {
  public long ID { get; set; }
  public string Name { get; set; }
  public long AuthorID { get; set; }
  //导航属性
  public Author Author { get; set; }
}
...
//映射
modelBuilder.Entity<Author>().ToTable("T_Authors");
...
//一对多配置
book.HasOne(a => a.Author).WithMany().HasForeignKey(a => a.AuthorID).IsRequired();
...
//查询
using Microsoft.EntityFrameworkCore;
...
//Include
var books = ctx.Books.Include(a => a.Author).First();

Include放到了Microsoft.EntityFrameworkCore命名空间下。

b)多对多
角色权限是典型的多对多关系,比如User与Role。EFCore目前还不支持先EF那样直接的多对多配置,需要拆分为两个一对多,所以还要设置User与Role的中间表:

public class UserRole {
  public long ID { get; set; }
  public long UserID { get; set; }
  public long RoleID { get; set; }
  public User User { get; set; }
  public Role Role { get; set; }
}
...
//两个一对多关系
userRole.HasOne(a => a.User).WithMany().HasForeignKey(a => a.UserID).IsRequired();

userRole.HasOne(a => a.Role).WithMany().HasForeignKey(a => a.RoleID).IsRequired();
...
//查询
var rel = ctx.UserRoles.Include(a=>a.Role).Where(r => r.UserID == userID);

学习资料:如鹏网.net提高班http://www.rupeng.com/News/10/4603.shtml

.Net Core(二)EFCore的更多相关文章

  1. abp(net core)+easyui+efcore仓储系统——解决方案介绍(二)

    abp(net core)+easyui+efcore仓储系统目录 abp(net core)+easyui+efcore仓储系统——ABP总体介绍(一) ABP框架 首先介绍一下abp框架,abp其 ...

  2. abp(net core)+easyui+efcore实现仓储管理系统——使用 WEBAPI实现CURD (十二)

    abp(net core)+easyui+efcore实现仓储管理系统目录 abp(net core)+easyui+efcore实现仓储管理系统——ABP总体介绍(一) abp(net core)+ ...

  3. abp(net core)+easyui+efcore实现仓储管理系统——EasyUI之货物管理二 (二十)

    abp(net core)+easyui+efcore实现仓储管理系统目录 abp(net core)+easyui+efcore实现仓储管理系统——ABP总体介绍(一) abp(net core)+ ...

  4. abp(net core)+easyui+efcore实现仓储管理系统——EasyUI之货物管理三 (二十一)

    abp(net core)+easyui+efcore实现仓储管理系统目录 abp(net core)+easyui+efcore实现仓储管理系统——ABP总体介绍(一) abp(net core)+ ...

  5. abp(net core)+easyui+efcore实现仓储管理系统——EasyUI之货物管理四 (二十二)

    abp(net core)+easyui+efcore实现仓储管理系统目录 abp(net core)+easyui+efcore实现仓储管理系统——ABP总体介绍(一) abp(net core)+ ...

  6. abp(net core)+easyui+efcore实现仓储管理系统——EasyUI之货物管理五 (二十三)

    abp(net core)+easyui+efcore实现仓储管理系统目录 abp(net core)+easyui+efcore实现仓储管理系统——ABP总体介绍(一) abp(net core)+ ...

  7. abp(net core)+easyui+efcore实现仓储管理系统——EasyUI之货物管理六(二十四)

    abp(net core)+easyui+efcore实现仓储管理系统目录 abp(net core)+easyui+efcore实现仓储管理系统——ABP总体介绍(一) abp(net core)+ ...

  8. abp(net core)+easyui+efcore实现仓储管理系统——EasyUI之货物管理七(二十五)

    abp(net core)+easyui+efcore实现仓储管理系统目录 abp(net core)+easyui+efcore实现仓储管理系统——ABP总体介绍(一) abp(net core)+ ...

  9. abp(net core)+easyui+efcore实现仓储管理系统——EasyUI之货物管理八(二十六)

    abp(net core)+easyui+efcore实现仓储管理系统目录 abp(net core)+easyui+efcore实现仓储管理系统——ABP总体介绍(一) abp(net core)+ ...

随机推荐

  1. asp.net core的docker实践

    如果centos中没有安装和docker和.net core镜像,先安装docker和asp.net core 镜像 安装dockeryum -y install docker-io 启动 Docke ...

  2. 最全的maven的pom.xml文件详解

    pom.xml代码: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://ww ...

  3. mac下nginx搭建

    首先使用brew安装nginx brew install nginx 安装完毕后,如果我们要使用nginx监听本地的80端口,需要改掉mac自带的apache占用的80端口 sudo vim /etc ...

  4. 如何发布一个npm包(基于vue)

    前言:工作的时候总是使用别人的npm包,然而我有时心底会好奇自己如何发布一个npm包呢,什么时候自己的包能够被很多人喜欢并使用呢...今天我终于迈出了第一步. 前提:会使用 npm,有 vue 基础, ...

  5. python机器学习笔记 ID3决策树算法实战

    前面学习了决策树的算法原理,这里继续对代码进行深入学习,并掌握ID3的算法实践过程. ID3算法是一种贪心算法,用来构造决策树,ID3算法起源于概念学习系统(CLS),以信息熵的下降速度为选取测试属性 ...

  6. 图像边缘检测——几种图像边缘检测算子的学习及python 实现

    本文学习利用python学习边缘检测的滤波器,首先读入的图片代码如下: import cv2 from pylab import * saber = cv2.imread("construc ...

  7. SpringBoot入门之基于Druid配置Mybatis多数据源

    上一篇了解了Druid进行配置连接池的监控和慢sql处理,这篇了解下使用基于基于Druid配置Mybatis多数据源.SpringBoot默认配置数据库连接信息时只需设置url等属性信息就可以了,Sp ...

  8. c++语言的输入输出流库

    1.c++语言标准输入输出流 <1>控制符的用法 #include <iostream> #include <iomanip> using namespace st ...

  9. AngularJS初始化Select选择框

    一.引入 之前一个离职的同事负责的项目大量的引入了AngularJS的JS框架,后来我接手相关他项目里的功能.由于对AngularJS不是太熟,在他的功能上进行二次开发就比较费劲了,印象比较深的一个就 ...

  10. SQL Server中锁与事务隔离级别

    SQL Server中的锁分为两类: 共享锁 排它锁 锁的兼容性:事务间锁的相互影响称为锁的兼容性. 锁模式 是否可以持有排它锁 是否可以持有共享锁 已持有排它锁 否 否 已持有共享锁 否 是 SQL ...