Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >关于EF Code First模式不同建模方式对建表产生的影响

关于EF Code First模式不同建模方式对建表产生的影响

作者头像
郑小超.
发布于 2018-01-26 08:28:53
发布于 2018-01-26 08:28:53
1.1K00
代码可运行
举报
文章被收录于专栏:GreenLeavesGreenLeaves
运行总次数:0
代码可运行

今天在学EF Code First模式的时候,发现几个很有趣的问题,问题如下:

1、当编写玩实体后,不指定任何主键约束,EF会找长的最像Id的,然后设置其为主键,验证代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    //User类
    class User
    {
        public Guid UserId { get; set; }

        public string Name { get; set; }
    }
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class CodeFirstContext:DbContext
    {
        public DbSet<User> Users { get; set; }
    
        public CodeFirstContext() : base("name=CodeFirstDemo"){}

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
        }
    }
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
static void Main(string[] args)
        {
            using (var context = new CodeFirstContext())
            {
                foreach (var item in context.Users)
                {
                    Console.WriteLine(item.Name);
                }
                Console.ReadKey();
            }
        }

运行控制台,看看数据库会有什么表现?

结论:发现EF在我没有指定那个是主键的情况下,将UserId设为了主键

2、当一个实体中有两个带Id的字段,EF会将最像Id的设为主键,优先级  Id>UserId>UserId_Id

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class User
    {
        public Guid Id { get; set; }

        public Guid UserId { get; set; }

        public string Name { get; set; }
    }

其他代码相同,只改User类代码,运行控制台看数据库表现

EF将Id设为了主键,UserId和UserId_Id的优先级自行验证.

3、关于外键的问题,当在实体中加入导航属性,EF生成外键可能会当前实体中的其他字段的影响.验证代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    class PhotoInfo
    {
        public Guid Id { get; set; }
        public string PhootoContent { get; set; }
        public string IsActive { get; set; }
        public User User { get; set; }

    }

    //User类
    class User
    {
        public Guid Id { get; set; }

        public string Name { get; set; }
    }
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    class CodeFirstContext:DbContext
    {
        public DbSet<User> Users { get; set; }
        public DbSet<PhotoInfo> PhotoInfos { get; set; }

        public CodeFirstContext() : base("name=CodeFirstDemo"){}

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
        }
    }
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    static void Main(string[] args)
        {
            using (var context = new CodeFirstContext())
            {
                foreach (var item in context.Users)
                {
                    Console.WriteLine(item.Name);
                }
                foreach (var item in context.PhotoInfos)
                {
                    Console.WriteLine(item.PhootoContent);
                }
                Console.ReadKey();
            }
        }

看看数据库的表现:

EF生成了一个User_Id的外键属性,关联User表

下面修改PhotoInfo实体,代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    class PhotoInfo
    {
        public Guid Id { get; set; }
        public string PhootoContent { get; set; }
        public string IsActive { get; set; }
        public Guid UserId { get; set; }
        public User User { get; set; }

    }

EF不再自动生成外键字段,而是将UserId属性设为了外键.

以上都是我测试出来的关于EF默认的行为,比较片面,欢迎指正.

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017-10-25 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
.NET EF Core(Entity Framework Core)
1、Entity Framework Core(EF Core)是微软官方的ORM框架。优点:功能强大、官方支持、生产效率高、力求屏蔽底层数据库差异;缺点:复杂、上手门槛高、不熟悉EFCore的话可能会进坑。 2、Dapper。优点:简单,N分钟即可上手,行为可预期性强;缺点:生产效率低,需要处理底层数据库差异。 3、EF Core是 模型驱动 (Model-Driven)的开发思想,Dapper是 数据库驱动(DataBase-Driven)的开发思想的。没有优劣,只有比较。 4、性能: Dapper等≠性能高;EF Core≠性能差。 5、EF Core是官方推荐、推进的框架,尽量屏蔽底层数据库差异,.NET开发者必须熟悉,根据的项目情况再决定用哪个。
鱼找水需要时间
2024/03/23
1.1K0
.NET EF Core(Entity Framework Core)
.NET Core开发实战(第29课:定义仓储:使用EF Core实现仓储层)--学习笔记
映射关系,针对每一个领域模型创建一个 EntityTypeConfiguration
郑子铭
2021/01/13
2.6K0
.NET Core开发实战(第29课:定义仓储:使用EF Core实现仓储层)--学习笔记
EF基础知识小记六(使用Code First建模自引用关系,常用于系统菜单、文件目录等有层级之分的实体)
日常开发中,经常会碰到一些自引用的实体,比如系统菜单、目录实体,这类实体往往自己引用自己,所以我们必须学会使用Code First来建立这一类的模型. 以下是自引用表的数据库关系图: ok,下面开始介
郑小超.
2018/01/26
9900
EF Core关系配置
关系配置: EF Core中实体之间关系的配置的套路: HasXXX(…).WithXXX(…); 有XXX、反之带有XXX。 XXX可选值One、Many。
鱼找水需要时间
2024/03/24
4550
EF Core关系配置
ef和mysql使用(二)--让mysql支持EntityFramework.Extended实现批量更新和删除
我们都知道Entity Framework 中不能同时更新多条记录,但是一个老外写的扩展库可以实现此功能EntityFramework.Extended,但是如何是mysql数据库要怎么实现呢
yaphetsfang
2020/07/30
1.4K0
【愚公系列】2023年09月 .NET/C#知识点-EF配置软删除
软删除是指在数据库中,对数据进行标记而不是实际删除数据记录。标记数据记录通常是通过添加一个额外的字段(如“deleted_at”)来实现的,表示该数据记录已被标记为删除。软删除的作用是保留数据完整性和历史记录,同时避免永久删除数据记录。这有助于恢复数据记录和分析数据历史趋势。软删除还可以减少数据库中的物理删除,提高数据安全性和系统性能。
愚公搬代码
2025/05/31
600
Mysql 该如何 Entity Framework 数据库迁移 和 如何更好的支持EF.Extended
问题 1.在使用EntityFramework访问Mysql的时候,使用迁移来生成数据库或者更新数据库时候会遇到一些问题 2.EntityFramework.Extended对Mysql的支持不是很完全,其中修改是无法直接使用的需要做一些处理 3.EntityFramework.Extended如何跟EntityFramework其他的操作在一个事物里面(针对网友zengfanlin 问题) 解决方案 1.首先解决第一个问题 准备条件:用Nuget下载Mysql.Data.Entity(可以将依赖连同下载)
逸鹏
2018/04/11
1.8K0
Mysql 该如何 Entity Framework 数据库迁移 和 如何更好的支持EF.Extended
【愚公系列】2023年02月 .NET/C#知识点-使用控制台手搭webapi框架
WebAPI是一种协议,用于允许网络应用程序(如浏览器)与网络服务器(如Web服务器)之间进行通信。它可以用于处理数据,访问数据库,处理图像和视频,以及进行其他高级功能。
愚公搬代码
2023/03/16
1.6K0
【愚公系列】2023年02月 .NET/C#知识点-使用控制台手搭webapi框架
Oracle中使用Entity Framework 6.x Code-First方式开发
去年写过一篇EF的简单学习笔记,当时EF还不支持Oracle的Code-First开发模式,今天无意又看了下Oracle官网,发现EF6.X已经支持了,并且给出了二篇教程(英文版): 1.Using NuGet to Install and Configure Oracle Data Provider for .NET 2.Entity Framework Code First and Code First Migrations for Oracle Database 基本上照着做就行了,为了方便不愿意啃英
菩提树下的杨过
2018/01/19
1.5K0
Oracle中使用Entity Framework 6.x Code-First方式开发
.NET 云原生架构师训练营(模块二 基础巩固 EF Core 介绍)--学习笔记
一个工作单元在一个事务范围内保留所有对数据库的变更,在这个工作单元结束的时候一次性提交所有改动到数据库
郑子铭
2020/12/27
1K0
.NET 云原生架构师训练营(模块二 基础巩固 EF Core 介绍)--学习笔记
C#进阶-Entity Framework 5 原理与使用详解
本文详细介绍了Entity Framework 5(EF5)在C#中的使用方法,包括EF5的基本概念、与其他持久层框架的比较、基本语法和高级语法的使用,并通过实例讲解了如何在项目中集成和使用EF5。作为微软提供的ORM(对象关系映射)框架,EF5在简化数据库操作、提高开发效率方面发挥了重要作用。本文还将深入探讨EF5的核心原理,通过内部代码展示其工作机制。最后,总结了EF5的优缺点及其在实际开发中的应用场景,为开发者提供全面的指导。
Damon小智
2024/08/17
6191
C#进阶-Entity Framework 5 原理与使用详解
Entity Framework Repository模式
如果我们用最原始的EF进行设计对每个实体类的“C(增加)、R(读取)、U(修改)、D(删除)”这四个操作。
aehyok
2018/09/11
1.2K0
Entity Framework Repository模式
在 EF Core 7 中实现强类型 ID
在杨中科老师 B 站的.Net Core 视频教程[1]其中 DDD 部分讲到了强类型 ID(Strongly-typed-id)的概念,也叫受保护的密钥(guarded keys)当时在 .NET 中的 DDD 实现是个悬而未决的问题,之后我也一直在寻找相关的实现方案。
桑榆肖物
2023/01/03
1.4K0
在 EF Core 7 中实现强类型 ID
初探领域驱动设计(2)Repository在DDD中的应用
概述 上一篇我们算是粗略的介绍了一下DDD,我们提到了实体、值类型和领域服务,也稍微讲到了DDD中的分层结构。但这只能算是一个很简单的介绍,并且我们在上篇的末尾还留下了一些问题,其中大家讨论比较多的,也是我本人之前有一些疑问的地方就是Repository。我之前觉得IRepository和三层里面的IDAL很像,为什么要整出这么个东西来;有人说用EF的话就不需要Repository了;IRepository是鸡肋等等。 我觉得这些问题都很好,我自己也觉得有问题,带着这些问题我们就来看一看Repositor
用户1153966
2018/03/14
1.5K0
初探领域驱动设计(2)Repository在DDD中的应用
EF 约定介绍
当前环境为EF Code First开发模式中 一、EF默认约定 1、常用约定 (1)、当没有显示指定实体主键的时候,EF会默认将长得最像Id的属性(且类型为GUID)设为主键 (2)、设计实体时,当一个实体包含一个集合属性,该集合属性里面的元素是另一个实体时,则默认未一对多关系,即使没有显示的指定一对多的关系,EF会默认的设置主外键(主从)关系 (3)、一对一的实体关系,需要手动设置主从关系 (4)、多对多无载荷关系实体,EF自动生成中间表,不需要新增实体来表示. (5)、表名默认复数化 2、类型发现约定
郑小超.
2018/01/26
1.9K0
EF基础知识小记七(拆分实体到多个表以及拆分表到多个实体)
一、拆分实体到多个表 1、在日常开发中,会经常碰到一些老系统,当客户提出一些新的需求,这些需求需要在原来的表的基础上加一些字段,大多数人会选择通过给原表添加字段的方式来完成这些需求,方法,虽然可行,但是如果架构不合理的系统,就会牵一发而动全身.所以处理这种需求比较合理的方式是:建一张新表来存放新的字段. 通过叫做合并两张及以上的表到一个单独的实体,也叫分拆一个实体到多个表,我们把每个组成部分当成一个逻辑实体.这个过程叫做逻辑分拆. 缺点:每当获取实体时,框架都需要额外的Join联结. 2、示例 下面通过一个
郑小超.
2018/01/26
1.5K0
.NET:Entity Framework 笔记
有二年没关注EF,今天无意试了下发现跟主流的Hibernate等ORM框架越来越接近了,先看下Entity类的定义: using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; namespace EFSample.Model { [Table("T_ORDER")]
菩提树下的杨过
2018/01/19
1.1K0
Asp.net MVC 中 CodeFirst 开发模式实例
  昨天写的这篇博客因为下班时间到了忘记保存了,好郁闷,得重新写一遍。实习所在公司使用的是CodeFirst开发模式,最近开始参与到公司的项目里面来了,发现这个模式特别好用,建库建表改变字段属性添加删除字段等等操作都无需自己在数据库动手操作,只需要编写代码即可实现,着实是方便了许多。今天来记录一下如何使用CodeFirst开发模式,闲言少叙,下面进入正题。
CherishTheYouth
2019/07/30
1K0
Asp.net MVC 中 CodeFirst 开发模式实例
Entity Framework——记录执行的命令信息
有两种方法可以记录执行的SQl语句: 使用DbContext.Database.Log属性 实现IDbCommandInterceptor接口 一 使用DbContext.Database.Log属性
甜橙很酸
2018/03/30
1.2K0
登录注册的小项目对比.Net Core与 .Net Framework的一些区别
UserSys.IServices:主要有实体和对实体的配置,还有对实体的操作接口
张哥编程
2024/12/19
1270
登录注册的小项目对比.Net Core与 .Net Framework的一些区别
推荐阅读
相关推荐
.NET EF Core(Entity Framework Core)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验