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. 用document.readyState实现网页加载进度条

    概述 之前以为给网页设置加载进度条很麻烦,今天一学真是超级简单,记录下来供以后开发时参考,相信对其他人也有用. readyState 主要运用了document.readyState和nprogres ...

  2. python中的变量和算数运算

    先说下变量的作用: 用来保存数据,为什么要保存? 后面要使用. 变量的概念: 变量就是用来存储一些信息,供程序以后调用或者操作修改.变量为标记数据提供了一种描述性的名字,以便我们的程序可以被程序的阅读 ...

  3. Leetcode:148_Sort List | O(nlogn)链表排序 | Medium

    题目:Sort List Sort a linked list in O(n log n) time using constant space complexity 看题目有两个要求:1)时间复杂度为 ...

  4. spring boot 访问静态资源的步骤

    1)resources/static下放置html文件.(或者static下新建目录 http://hcss:8090/imgs/单例.png) 2)webapp下放置html文件. 如果两个路径下有 ...

  5. 利用history.pushState()实现页面无刷新更新

    本来是在研究vue-router如何记录滚动位置,点返回的时候还是回到原来的位置,看到有人说的history.state存了一个值,才把history研究一下,发现 history.pushState ...

  6. Xpath定位方法深入探讨及元素定位失败常见情况

    一.Xpath定位方法深入探讨 (1)常用的Xpath定位方法及其特点 使用绝对路径定位元素. 例如: driver.findElement(By.xpath("/html/body/div ...

  7. Hive ROW_NUMBER,RANK(),DENSE_RANK()

    准备数据 浙江,杭州,300 浙江,宁波,150 浙江,温州,200 浙江,嘉兴,100 江苏,南京,270 江苏,苏州,299 江苏,某市,200 江苏,某某市,100   创建表 CREATE t ...

  8. JVM 监控,调优,调试

    JVM监控工具 Java的安装包自带了很多优秀的工具,善用这些工具对于监控和调试Java程序非常有帮助.常用工具如下: jps 用途:jps用来查看JVM里面所有进程的具体状态, 包括进程ID,进程启 ...

  9. SpringBoot一站式启动流程源码分析

    一.前言 由上篇文章我们得知,SpringBoot启动时,就是有很简单的一行代码.那我们可以很清楚的看到这行代码的主角便是SpringApplication了,本文我们就来聊一聊这货,来探寻Sprin ...

  10. SpringBoot----跨域配置

    前言: 当它请求的一个资源是从一个与它本身提供的第一个资源的不同的域名时,一个资源会发起一个跨域HTTP请求(Cross-site HTTP request).比如说,域名A ( http://dom ...