EF Core Fluent API
多对多配置
先安装 Install-Package MySql.Data.EntityFrameworkCore
创建3个表

创建类
    public class Role
    {
        public long Id { get; set; }
        public string Name { get; set; }
    }
	 public class User
    {
        public long Id { get; set; }
        public string Name { get; set; }
    }
	 public class UserRoleRelation
    {
        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; }
    }
编写DbContext,ef core的DbContext等EF的核心类在using Microsoft.EntityFrameworkCore;
public class MyDbContext : DbContext
    {
        public DbSet<User> Users { get; set; }
        public DbSet<Role> Roles { get; set; }
        public DbSet<UserRoleRelation> UserRoleRelations { get; set; }
        public DbSet<weixin_userinfo> WeixinUserinfo { get; set; }
        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            base.OnConfiguring(optionsBuilder);
            optionsBuilder.UseMySQL("Server=127.0.0.1;database=test;uid=root;pwd=123456");
        }
        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
            var typeUser = modelBuilder.Entity<User>();
            typeUser.ToTable("T_Users");
            var typeRole = modelBuilder.Entity<Role>();
            typeRole.ToTable("T_Roles");
            var typeUserRoleRelation = modelBuilder.Entity<UserRoleRelation>();
            typeUserRoleRelation.ToTable("T_UserRoleRelations");
            /**
             * 多对多:不用中间实体的多对多还不支持,要自己拆成用中间实体的两对一对多。
             * EF中(一对多)写法:builder.HasRequired(e => e.Role).WithMany();
             */
            typeUserRoleRelation.HasOne(e=>e.Role).WithMany().HasForeignKey(e=>e.RoleId).IsRequired();
            typeUserRoleRelation.HasOne(e=>e.User).WithMany().HasForeignKey(e=>e.UserId).IsRequired();
        }
    }
通过UseMySQL这样的扩展方法来配置连接字符串,这是.Net core的风格!可以把连接字符串写到配置文件中,然后再读取。
运行:
            using (MyDbContext ctx = new MyDbContext())
            {
                var user = ctx.Users.First();
                long userId = user.Id;
                var relactions = ctx.UserRoleRelations.Include(e => e.Role)
                .Where(r => r.UserId == userId);
                foreach (var relation in relactions)
                {
                    Console.WriteLine(relation.Role.Name);
                }
            }
链接:EF Fluent API https://www.cnblogs.com/tangge/p/9831957.html
EntityTypeConfiguration
ef core 1.1
没有内置EntityTypeConfiguration,需要手动自己注册一个
- IEntityTypeConfiguration.cs
using Microsoft.EntityFrameworkCore;
namespace Entity.Config
{
    public interface IEntityTypeConfiguration
    {
        void Map(ModelBuilder builder);
    }
    public interface IEntityTypeConfiguration<T> : IEntityTypeConfiguration where T : class
    {
        void Map(ModelBuilder builder);
    }
}
- EntityTypeConfiguration.cs
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
namespace Entity.Config
{
    public abstract class EntityTypeConfiguration<T> : IEntityTypeConfiguration<T> where T : class
    {
        public abstract void Map(EntityTypeBuilder<T> builder);
        public void Map(ModelBuilder builder)
        {
            Map(builder.Entity<T>());
        }
    }
}
- ModelBuilderExtenions.cs
using Microsoft.EntityFrameworkCore;
namespace Entity.Config
{
    public static class ModelBuilderExtenions
    {
        private static IEnumerable<Type> GetMappingTypes(this Assembly assembly, Type mappingInterface)
        {
            return assembly.GetTypes().Where(x => !x.GetTypeInfo().IsAbstract &&
                                                  x.GetInterfaces().Any(y => y.GetTypeInfo().IsGenericType
                                                                             && y.GetGenericTypeDefinition() ==
                                                                             mappingInterface));
        }
        public static void AddEntityConfigurationsFromAssembly(this ModelBuilder modelBuilder, Assembly assembly)
        {
            var mappingTypes = assembly.GetMappingTypes(typeof(IEntityTypeConfiguration<>));
            foreach (var config in mappingTypes.Select(Activator.CreateInstance).Cast<IEntityTypeConfiguration>())
            {
                config.Map(modelBuilder);
            }
        }
    }
}
修改MyDbContext.cs
protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
            //modelBuilder.AddEntityConfigurationsFromAssembly(Assembly.GetEntryAssembly());//参数表示config类所在的程序集
            modelBuilder.AddEntityConfigurationsFromAssembly(Assembly.Load("Entity"));//这里加载的是 Entity程序集
			...
	    }
下面示例创建一个UserRoleRelationConfig.cs,其他自己建
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
namespace Entity.Config
{
    public class UserRoleRelationConfig:EntityTypeConfiguration<UserRoleRelation>
    {
        public override void Map(EntityTypeBuilder<UserRoleRelation> builder)
        {
            builder.ToTable("T_UserRoleRelations");
            /**
             * 多对多:不用中间实体的多对多还不支持,要自己拆成用中间实体的两对一对多。
             * EF中(一对多)写法:builder.HasRequired(e => e.Role).WithMany();
             */
            builder.HasOne(e => e.Role).WithMany().HasForeignKey(e => e.RoleId).IsRequired();
            builder.HasOne(e => e.User).WithMany().HasForeignKey(e => e.UserId).IsRequired();
        }
    }
}
ef core 2.0
EF Core 2.0 中内置了 IEntityTypeConfiguration
  public class UserRoleRelationConfig:IEntityTypeConfiguration<UserRoleRelation>
   {
       public void Configure(EntityTypeBuilder<UserRoleRelation> builder)
       {
            builder.ToTable("T_UserRoleRelations");
            /**
             * 多对多:不用中间实体的多对多还不支持,要自己拆成用中间实体的两对一对多。
             * EF中(一对多)写法:builder.HasRequired(e => e.Role).WithMany();
             */
            builder.HasOne(e => e.Role).WithMany().HasForeignKey(e => e.RoleId).IsRequired();
            builder.HasOne(e => e.User).WithMany().HasForeignKey(e => e.UserId).IsRequired();
        }
   }
EF Core Fluent API的更多相关文章
- EF:Fluent API 把一对多映射为一对一
		假设有两张表:A表和B表.A表与B表在数据库中的关系是一对多,但我们需要在EF中映射为一对一. 首先在A实体类和B实体类中互相为对方增加一个实体类的属性: public A { public B B ... 
- DB表的关系及EF中Fluent API的使用
		现在使用多数的数据库是关系型数据库,那么表与表之间的关系就会显得尤其重要,对于数据的CRUD处理和以后数据的分析有很大的好处.下面是对于数据库中对表关系的理解以及在EF中使用Fluent API来创建 ... 
- 第六节:框架搭建之EF的Fluent Api模式的使用流程
		一. 前言 沉寂了约一个月的时间,今天用一篇简单的文章重新回归博客,主要来探讨一下Fluent Api模式在实际项目中的使用流程. 1. Fluent API属于EF CodeFirst模式的一种,E ... 
- 第十八篇 .NET高级技术之Linq与EF Code-First Fluent API基础讲解
		1.FluentApi简介 在这里提供了一个fluentapi基础的DEMO然后咱们在进一步的学习,直接上干货. 第一步在数据库创建一个表:person 第二步:新建控制台程序FluentAPI 第三 ... 
- 扩展EF的Fluent API中的 OnModelCreating方法 实现全局数据过滤器
		1.生成过滤的表达式目录树 protected virtual Expression<Func<TEntity, bool>> CreateFilterExpression&l ... 
- EF使用Fluent API配置映射关系
		定义一个继承自EntityTypeConfiguration<>泛型类的类来定义domain中每个类的数据库配置,在这个自定义类的构造函数中使用我们上次提到的那些方法配置数据库的映射. 映 ... 
- 一起学ASP.NET Core 2.0学习笔记(二): ef core2.0 及mysql provider 、Fluent API相关配置及迁移
		不得不说微软的技术迭代还是很快的,上了微软的船就得跟着她走下去,前文一起学ASP.NET Core 2.0学习笔记(一): CentOS下 .net core2 sdk nginx.superviso ... 
- EF Core中通过Fluent API完成对表的配置
		EF Core中通过Fluent API完成对表的配置 设置实体在数据库中的表名 通过ToTable可以为数据模型在数据库中自定义表名,如果不配置,则表名为模型名的复数形式 public class ... 
- EF Core中Fluent Api如何删除指定数据表中的行
		这两天一直在研究在code first下如何删除数据表中的指定行,于是开始搜狗,后来百度,压根就找不到资料,后来一想可能我的搜索关键字有问题,而且ef core命令与ef的命令差不多,于是从这两个方面 ... 
随机推荐
- 【转】Python之mmap内存映射模块(大文本处理)说明
			[转]Python之mmap内存映射模块(大文本处理)说明 背景: 通常在UNIX下面处理文本文件的方法是sed.awk等shell命令,对于处理大文件受CPU,IO等因素影响,对服务器也有一定的压力 ... 
- 解决64bit不能连接access的问题
			原有的程序迁移至64位,结果调用数据库时出错,原因是jet驱动没有64位的,得换用64位的驱动程序: 1. 下载运行 AccessDatabaseEngine_x64.exe (http://ww ... 
- python3之模块SMTP协议客户端与email邮件MIME对象
			转载自https://www.cnblogs.com/zhangxinqi/p/9113859.html 阅读目录 1.smtplib模块的常用类与方法 2.处理邮件MIME 3.实例 (1)使用HT ... 
- [转]JS根据useAgent来判断edge, ie, firefox, chrome, opera, safari 等浏览器的类型及版本
			js根据浏览器的useAgent来判断浏览器的类型 userAgent 属性是一个只读的字符串,声明了浏览器用于 HTTP 请求的用户代理头的值. JavaScript语法:navigator.use ... 
- $Django Rest Framework-序列化组件
			1 序列化组件 e=serializers.SerializerMethodField() # 方法名:叫get_字段名, 参数,返回字典 def get_e(self,obj): #obj为b ... 
- web@前端--html,css,javascript简介、第一个页面(常用标签简介)
			1.什么是标签#1.在HTML中规定标签使用英文的的尖括号即`<`和`>`包起来,如`<html>`.`<head>`.`<body>`都是标签,#2. ... 
- LabVIEW---vi图标和符号的制作
			前言: 使用图形化设计语言进行开发时候,为VI添加说明的一个重要的方法是为其建立一个形象的图标,每个VI都在前面板后程序框图的右上角有一个图标,它是VI的图形化表示.如果VI当作子VI调用,该图标就会 ... 
- 无备份mysql删除表后恢复
			mysql从5.6.17开始自动设置innodb_file_per_table为on,每个表设置单独表空间,数据不是集中存放在ibdata1里.下面测试下无备份后drop表后的恢复. 前奏生成数据字典 ... 
- Js -----后台json数据,前端生成下载text文件
			需要引入 <script src="/assets/libs/single_file/jquery.min.js"></script> <script ... 
- appium+java(五)微信小程序自动化测试实践
			前言: 上一篇<appium+java(四)微信公众号自动化测试实践>中,尝试使用appium实现微信公众号自动化测试,接着尝试小程序自动化,以学院小程序为例 准备工作 1.java-cl ... 
