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的命令差不多,于是从这两个方面 ...
随机推荐
- nginx 配置域名转发
自己测试环境,配置下载目录和一个jenkins的地址: 域名跳转,反向代理 # cat ../nginx.conf user www www; worker_processes ; error_log ...
- configparser模块--配置文件
该模块适用于配置文件的格式与windows ini文件类似,可以包含一个或多个节(section),每个节可以有多个参数(键=值). 创建文件 import configparser config = ...
- Ubuntu16.04用源安装Nginx+PHP5.6+MySQL5.6
安装Nginx 1.首先添加nginx_signing.key(必须,否则出错) $ wget http://nginx.org/keys/nginx_signing.key $ sudo apt-k ...
- SharePoint 2013: Workflow Manager Backend 服务意外地终止
一.环境:SharePoint 2013 + Workflow Manager 1.0 二.错误描述: Workflow Manager Backend 服务意外地终止,这种情况已经出现了 42106 ...
- Qt5全局热键第三方库qxtglobalshortcut5使用
1.下载第三方库https://github.com/ddqd/qxtglobalshortcut5. 2.把qxtglobalshortcut5文件放在项目目录下,在项目.pro加入一句,inclu ...
- C# 获取区域和语言值
其他方法如 System.Globalization.CultureInfo.InstalledUICulture.Name == "zh-CN" 不能获取.只有通过读注册表的方法 ...
- 数据库中关于convert的参数学习(转化函数用法)
该页面中的内容来之http://www.cnblogs.com/xionglee/articles/1444916.html,以前我一直不知道当中的1,2,3表示什么,现在才知道呀!style 格式: ...
- 阿里服务器配置swap
说明:阿里服务器安装系统之后,默认swap为0 .该篇是阿里服务器上配置swap 的过程记录: 1.进入目录 cd /var/ 2.获取要增加的SWAP文件块(这里以1GB为例,count = 102 ...
- OracleAES加密
OracleAES加密 (2012-04-29 21:52:15)转载▼标签: oracle aes 加密 it 分类: 开发-- 加密函数CREATE OR REPLACE FUNCTION FUN ...
- Java、Apache Tomcat下载与安装及环境变量配置
1.Java JDK 与 Apache Tomcat 下载 JDK 下载 Apache Tomcat 下载 2.安装与环境变量配置 关于 JDK 的安装挺简单的,网上教程也挺多,Tomcat 下载免安 ...