【Entity Framework】创建并配置模型

【Entity Framework】创建并配置模型

文章目录

  • 【Entity Framework】创建并配置模型
    • 一、概述
    • 二、使用fluent API配置模型
    • 三、分组配置
    • 四、对实体类型使用`EntityTypeConfigurationAttribute`
    • 四、使用数据注释来配置模型
    • 五、实体类型
      • 5.1 在模型中包含类型
      • 5.2 从模型中排除类型
      • 5.3 从迁移中排除
    • 六、表名称与表架构

在这里插入图片描述

一、概述

EF Core使用元数据模型来描述如何将应用程序的实体类型映射到基础数据库。此模型是使用一组约定构建的,这些约定是寻找常用模式的启发式方法。然后,可以使用映射特性自定义模型和在OnModelCreating中调用ModelBuilder方法(也称为Fluent API),这两者都将替代约定执行的配置。

大多数配置可以应用于面向任何数据存储的模型。提供程序还可以启用特定于特定数据存储的配置,也可以忽略不支持或不适合的配置。

二、使用fluent API配置模型

可在派生上下文中替代OnModelCreating方法,并使用Fluent API类配置模型。此配置方法最为有效,并可在不修改实体类的情况下指定配置。此配置方法最为有效,并可在不修改实体类的情况下指定配置。Fluent API配置具有最高优先级,并将替代约定和数据注释。配置按调用方法的顺序应用,如果存在任何冲突,最新调用将替代以前指定的配置。

using Microsoft.EntityFrameworkCore;
namespace EFModeling.EntityProperties.FluentAPI.Required;
internal class MyContext : DbContext
{public DbSet<Blog> Blogs { get; set; }#region Requiredprotected override void OnModelCreating(ModelBuilder modelBuilder){modelBuilder.Entity<Blog>().Property(b => b.Url).IsRequired();}#endregion
}
public class Blog
{public int BlogId { get; set; }public string Url { get; set; }
}

三、分组配置

为了减少OnModelCreating方法的大小,可以将实体类型的所有配置提取到实现IEntityTypeConfiguration<TEntity>的单独类中。

public class BlogEntityTypeConfiguration : IEntityTypeConfiguration<Blog>
{public void Configure(EntityTypeBuilder<Blog> builder){builder.Property(b => b.Url).IsRequired();}
}

然后,只需从 OnModelCreating 调用 Configure 方法

new BlogEntityTypeConfiguration().Configure(modelBuilder.Entity<Blog>());

四、对实体类型使用EntityTypeConfigurationAttribute

与其显示调用Configure,不如改为在实体类型上放置EntityTypeConfigurationAttribute,以便EF Core可以查找并使用适当的配置。

[EntityTypeConfiguration(typeof(BookConfiguration))]
public class Book
{public int Id { get; set; }public string Title { get; set; }public string Isbn { get; set; }
}

此特性意味着,每方模型中包含Book实体类型时,EF Core都将使用指定的IEntityTypeConfiguration实现。实体类型包含在使用普通机制其中一种机制的模型中,例如,通过为实体类型创建DbSet<TEntity>属性:

public class BooksContext : DbContext
{public DbSet<Book> Books { get; set; }
}

或者将其注册到OnModelCreating:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{modelBuilder.Entity<Book>();
}

四、使用数据注释来配置模型

可以将某些特性(称为数据注释)应用于类和属性。数据注释替代约定,但会被Fluent API配置替代。

using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using Microsoft.EntityFrameworkCore;namespace EFModeling.EntityProperties.DataAnnotations.Annotations;internal class MyContext : DbContext
{public DbSet<Blog> Blogs { get; set; }
}[Table("Blogs")]
public class Blog
{public int BlogId { get; set; }[Required]public string Url { get; set; }
}

五、实体类型

在上下文中包含一种类型的DbSet意味着它包含在EF Core的模型中;我们通常将此类类型称为实体。EF Core可以从数据库中读取和写入实体实例,如果使用的是关系数据库,EF Core可以通过迁移为实例创建表。

5.1 在模型中包含类型

按照约定,上下文的DbSet属性中公开的类型作为实体包含在模型中。还包括在OnModelCreating方法中指定的实体类型,以及通过递归探索其他发现的实体类型的导航属性找到的任何类型。

下面的代码示例中包含了所有类型:

  • 包含 Blog,因为它在上下文的 DbSet 属性中公开。
  • 包含 Post,因为它是通过 Blog.Posts 导航属性发现的。
  • 包含 AuditEntry因为它是 OnModelCreating 中指定的。
internal class MyContext : DbContext
{public DbSet<Blog> Blogs { get; set; }protected override void OnModelCreating(ModelBuilder modelBuilder){modelBuilder.Entity<AuditEntry>();}
}
public class Blog
{public int BlogId { get; set; }public string Url { get; set; }public List<Post> Posts { get; set; }
}public class Post
{public int PostId { get; set; }public string Title { get; set; }public string Content { get; set; }public Blog Blog { get; set; }
}
public class AuditEntry
{public int AuditEntryId { get; set; }public string Username { get; set; }public string Action { get; set; }
}

5.2 从模型中排除类型

如果不希望在模型中包含某一类型,可以使用NotMapped特性

[NotMapped]
public class BlogMetadata
{public DateTime LoadedFromDatabase { get; set; }
}

下面代码演示从Fluent API排除

protected override void OnModelCreating(ModelBuilder modelBuilder)
{modelBuilder.Ignore<BlogMetadata>();
}

5.3 从迁移中排除

将相同的实体类型映射到多个DbContext类型中,非常有用。在使用绑定上下文时,尤其如此,对于每段绑定上下文,使用不同DbContext类型的情况很常见。

protected override void OnModelCreating(ModelBuilder modelBuilder)
{modelBuilder.Entity<IdentityUser>().ToTable("AspNetUsers", t => t.ExcludeFromMigrations());
}

此配置迁移不会创建AspNetUsers该表,但IdentityUser扔包含在模型中,并且可正常使用。

如果需要再次使用迁移来管理表,则应创建不包括AspNetUsers的新迁移。下一次迁移将包含对表所做的任何更改。

六、表名称与表架构

按照约定,每个实体类型都将设置为映射到公开实体的DbSet属性名称相同的数据库表,如果给定实体不存在DbSet,则使用类名称。

可以手动配置表名:

[Table("blogs")]
public class Blog
{public int BlogId { get; set; }public string Url { get; set; }
}

Fluent API

protected override void OnModelCreating(ModelBuilder modelBuilder)
{modelBuilder.Entity<Blog>().ToTable("blogs");
}

使用关系数据库时,表按约定在数据库的默认架构中创建

[Table("blogs", Schema = "blogging")]
public class Blog
{public int BlogId { get; set; }public string Url { get; set; }
}

Fluent API

[Table("blogs", Schema = "blogging")]
public class Blog
{public int BlogId { get; set; }public string Url { get; set; }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/292790.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

loadbalancer 引入与使用

在消费中pom中引入 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId> </dependency> 请求调用加 LoadBalanced 注解 进行服务调用 默认负载均衡是轮训模式 想要切换…

【数据结构与算法】二叉树的遍历及还原

树形结构 - 有向无环图 树是图的一种。 树形结构有一个根节点树形结构没有回路根节点&#xff1a;A叶子节点&#xff1a;下边没有其他节点了节点:既不是根节点,又不是叶子节点的普通节点树的度:这棵树最多叉的节点有多少叉&#xff0c;这棵树的度就为多少树的深度&#xff1a…

实例、构造函数、原型、原型对象、prototype、__proto__、原型链……

学习原型链和原型对象&#xff0c;不需要说太多话&#xff0c;只需要给你看看几张图&#xff0c;你自然就懂了。 prototype 表示原型对象__proto__ 表示原型 实例、构造函数和原型对象 以 error 举例 图中的 error 表示 axios 抛出的一个错误对象&#xff08;实例&#xff0…

WiFiSpoof for Mac wifi地址修改工具

WiFiSpoof for Mac&#xff0c;一款专为Mac用户打造的网络隐私守护神器&#xff0c;让您在畅游互联网的同时&#xff0c;轻松保护个人信息安全。 软件下载&#xff1a;WiFiSpoof for Mac下载 在这个信息爆炸的时代&#xff0c;网络安全问题日益凸显。WiFiSpoof通过伪装MAC地址&…

C++入门知识详细讲解

C入门知识详细讲解 1. C简介1.1 什么是C1.2 C的发展史1.3. C的重要性1.3.1 语言的使用广泛度1.3.2 在工作领域 2. C基本语法知识2.1. C关键字(C98)2.2. 命名空间2.2 命名空间使用2.2 命名空间使用 2.3. C输入&输出2.4. 缺省参数2.4.1 缺省参数概念2.4.2 缺省参数分类 2.5. …

GRE和MGRE综合实验

实际网段划分 分配IP 1.IP划分 [r1]int g0/0/0 [r1-GigabitEthernet0/0/0]ip add 192.168.1.254 24 Mar 29 2024 16:42:44-08:00 r1 %%01IFNET/4/LINK_STATE(l)[3]:The line protocol IP on the interface GigabitEthernet0/0/0 has entered the UP state. [r1-Gigabi…

飞天使-k8s知识点28-kubernetes散装知识点5-helm安装ingress

文章目录 安装helm添加仓库下载包配置创建命名空间安装 安装helm https://get.helm.sh/helm-v3.2.3-linux-amd64.tar.gztar -xf helm-v3.2.3-linux-amd64.tar.gzcd linux-amd64mv helm /usr/local/bin修改/etc/profile 文件&#xff0c;修改里面内容,然后重新启用export PATH$P…

动态规划-----背包类问题(0-1背包与完全背包)详解

目录 什么是背包问题&#xff1f; 动态规划问题的一般解决办法&#xff1a; 0-1背包问题&#xff1a; 0 - 1背包类问题 分割等和子集&#xff1a; 完全背包问题&#xff1a; 完全背包类问题 零钱兑换II: 什么是背包问题&#xff1f; 背包问题(Knapsack problem)是一种…

Windows-安装infercnv包(自备)

目录 安装基础 ①安装JAGS a,找到适配版本 b&#xff0c;install for me only安装路径 ②安装"rjags"包 ③安装inferCNV 安装基础 版本&#xff1a; R version 4.2.2 (2022-10-31 ucrt) -- "Innocent and Trusting"安装的JAGS版本为JAGS 4.3.1 首…

GPT提示词分享 —— 智能域名生成器

提示词&#x1f447; 我希望你能充当一个聪明的域名生成器。我将告诉你我的公司或想法是什么&#xff0c;你将根据我的提示回复我一份域名备选清单。你只需回复域名列表&#xff0c;而不是其他。域名应该是最多 7-8 个字母&#xff0c;应该简短但独特&#xff0c;可以是朗朗上口…

C易错注意之分支循环,悬空else,短路表达式,函数static

接下来的日子会顺顺利利&#xff0c;万事胜意&#xff0c;生活明朗-----------林辞忧 前言&#xff1a; c语言中一些关于分支循环中continue常混淆&#xff0c;悬空esle问题&#xff0c;短路表达式&#xff0c;static ,extern在使用时稍不注意就会出错的点,接下来我们将介绍…

Monkey工具之fastbot-iOS实践

Monkey工具之fastbot-iOS实践 背景 目前移动端App上线后 crash 率比较高&#xff0c; 尤其在iOS端。我们需要一款Monkey工具测试App的稳定性&#xff0c;更早的发现crash问题并修复。 去年移动开发者大会上有参加 fastbot 的分享&#xff0c;所以很自然的就想到Fastbot工具。…

Lilishop商城(windows)本地部署【docker版】

Lilishop商城&#xff08;windows&#xff09;本地部署【docker版】 部署官方文档&#xff1a;LILISHOP-开发者中心 https://gitee.com/beijing_hongye_huicheng/lilishop 本地安装docker https://docs.pickmall.cn/deploy/win/deploy.html 命令端页面 启动后docker界面 注…

java回溯算法笔记

回溯算法综述 回溯用于解决你层for循环嵌套问题&#xff0c;且不剪枝的回溯完全等于暴力搜索。 回溯算法模板https://blog.csdn.net/m0_73065928/article/details/137062099?spm1001.2014.3001.5501 组合问题&#xff08;startindex避免使用重复元素&#xff09; “不含重复…

一篇讲明白 Hadoop 生态的三大部件

文章目录 每日一句正能量前言01 HDFS02 Yarn03 Hive04 HBase05 Spark及Spark Streaming关于作者推荐理由后记赠书活动 每日一句正能量 黎明时怀着飞扬的心醒来&#xff0c;致谢爱的又一天&#xff0c;正午时沉醉于爱的狂喜中休憩&#xff0c;黄昏时带着感恩归家&#xff0c;然后…

Redis持久化 RDB AOF

前言 redis的十大类型终于告一段落了,下面我们开始redis持久化新篇章 为啥需要持久化呢? 我们知道redis是挡在mysql前面的带刀侍卫 是在内存中的,假如我们的redis宕机了,难道数据直接冲入mysql??? 这显然是不可能的,mysql肯定扛不住这样的场景,所以我们有了redis持久化策略…

Linux 进程信号:产生信号

目录 一、通过终端按键产生信号 1、signal()函数 2、核心转储 3、ulmit命令 二、调用系统函数向进程发信号 1、kill()函数 2、raise()函数 3、abort()函数 三、发送信号的过程 读端关闭、写端继续写入的情况 如何理解软件条件给进程发送信号: 四、软件条件产生信…

【PythonGIS】Python实现批量导出面矢量要素(单个多面矢量->多个单面矢量)

可怜的我周六还在工作&#xff0c;已经很久没更新过博客了&#xff0c;今天正好有空就和大家分享一下。今天给大家带来的是使用Python将包含多个面要素/线要素的矢量批量导出单个要素的矢量&#xff0c;即一个要素一个矢量文件。之前写过多个矢量文件合并成一个矢量文件的博文&…

(一)kafka实战——kafka源码编译启动

前言 本节内容是关于kafka消息中间键的源码编译&#xff0c;并通过idea工具实现kafka服务器的启动&#xff0c;使用的kafka源码版本是3.6.1&#xff0c;由于kafka源码是通过gradle编译的&#xff0c;以及服务器是通过scala语言实现&#xff0c;我们要预先安装好gradle编译工具…

HarmonyOS像素转换-如何使用像素单位设置组件的尺寸。

1 卡片介绍 基于像素单位&#xff0c;展示了像素单位的基本知识与像素转换API的使用。 2 标题 像素转换&#xff08;ArkTS&#xff09; 3 介绍 本篇Codelab介绍像素单位的基本知识与像素单位转换API的使用。通过像素转换案例&#xff0c;向开发者讲解了如何使用像素单位设…