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的命令差不多,于是从这两个方面 ...
随机推荐
- Pytorch Visdom
fb官方的一些demo 一. show something 1. vis.image:显示一张图片 viz.image( np.random.rand(3, 512, 256), opts=dic ...
- Python3-socket网络知识储备
本文参考文章:http://www.cnblogs.com/linhaifeng/articles/6129246.html 计算机基础知识 客户端软件基于网络发送一条信息给服务端软件,流程是: 1. ...
- git与eclipse集成之文件回退
1.1. 文件回退 1.1.1. 添加或修改文件回退,选择要回退的文件,右键Overwrite 1.1.2. 删除文件回退 选择要回退的文件,右键Overwrite 文件变 ...
- Codeforces Educational Round 37
Solved CodeForces 920A Water The Garden Solved CodeForces 920B Tea Queue Solved CodeForces ...
- GetCheckProxy
@echo off setlocal enabledelayedexpansion set infile=free.txt set url=https://www.google.com/?gws_rd ...
- $Django 中间件 csrf
中间件 -中间件是什么?请求和响应之间的一道屏障 -中间件作用:控制请求和响应 -django中内置几个中间件 process_request(self,request) proces ...
- 通过python操作GeoLite2-City.mmdb库将nginx日志访问IP转换为城市写入数据库
通过python操作GeoLite2-City.mmdb库将nginx日志写入数据库 # 创建存放nginx日志的表accesslog2 CREATE TABLE `accesslog2` ( `id ...
- Jmeter下载安装配置及使用(windows)
1 前言 仅作为记录使用. 2 步骤 2.1 下载地址:http://jmeter.apache.org/download_jmeter.cgi 2.2 选择binary版本即可:apache-jme ...
- ElasticSearch搜索数据到底有几种方式?
Elasticsearch允许三种方式执行搜索请求: GET请求正文: curl -XGET "http://localhost:9200/app/users/_search" - ...
- LuoGu P2735 电网 Electric Fences
题目传送门 这个东西,本来我是用求出两条一次函数解析式然后判断在x坐标下的y坐标值来做的 首先因为没考虑钝角三角形,WA了 然后又因为精度处理不好又WA了 一气之下,只能去网上查了查那个皮克定理 首先 ...