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的命令差不多,于是从这两个方面 ...
随机推荐
- C#如何操作XML文件
⒈XML? XML是一种可扩展的标记语言 具有以下特点 1.严格区分大小写 2.标签成对出现 3.有且只有一个根节点 ⒉XML的创建 <?xml version="1.0" ...
- javascript高级程序语言学习笔记
1.加法操作符(+)的用法 第一种情况,如果两个操作符都是数值,执行常规的加法计算. 第二种情况,如果两个操作数都是字符串,则将第二个操作数与第一个操作数拼接起来. 第三种情况,只有一个操作数是字符串 ...
- Windows 1.0 to Windows 10
- Vue 根组件,局部,全局组件 | 组件间通信,案例组件化
一 组件 <div id="app"> <h1>{{ msg }}</h1> </div> <script src=" ...
- SQL Server 2017 安装详解
SQL server 2017下载链接:https://pan.baidu.com/s/1FSzqJfHQAa0QpZ_fObrfjQ 提取码:1xvb 1.双击iso镜像文件 打开setup ...
- mybatis:访问静态变量或方法
访问方法: <if test="@com.csget.constant.ConstantApp@getUser('mobile')== 'kf'"> <![CDA ...
- vue.js computed,watch的区别
computed: 当数据没有变化时,它会去读取缓存,当数据有变化时,它才会去执行computed,而不会像method和watch一样每次都去执行函数(摘自https://www.jb51.net/ ...
- Mvc 批量图片上传
首先导入文件(官网上下载 kindeditor ): <link href="~/kindeditor-4.1.11-zh-CN/kindeditor/themes/default/d ...
- 树·二叉查找树ADT(二叉搜索树/排序树)
1.定义 对于每个节点X,它的左子树中所有的项的值小于X的值,右子树所有项的值大于X的值. 如图:任意一个节点,都满足定义,其左子树的所有值小于它,右子树的所有值大于它. 2.平均深度 在大O模型中, ...
- C# 制作向导
1.FormBase界面:有“帮助,上一步,下一步,取消”按钮,这些按钮放置在一个Panel上. namespace DataBase { public partial class FormB ...