关于EF Code First模式不同建模方式对建表产生的影响
今天在学EF Code First模式的时候,发现几个很有趣的问题,问题如下:
1、当编写玩实体后,不指定任何主键约束,EF会找长的最像Id的,然后设置其为主键,验证代码如下:
//User类
class User
{
public Guid UserId { get; set; } public string Name { get; set; }
}
class CodeFirstContext:DbContext
{
public DbSet<User> Users { get; set; } public CodeFirstContext() : base("name=CodeFirstDemo"){} protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
}
}
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
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生成外键可能会当前实体中的其他字段的影响.验证代码如下:
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; }
}
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);
}
}
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实体,代码如下:
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默认的行为,比较片面,欢迎指正.
关于EF Code First模式不同建模方式对建表产生的影响的更多相关文章
- 使用ef code first模式,在部署后服务器端把数据库同步到最新版本的方法
共有两种方法: 1.使用migrate.exe 具体使用方法请参考 msdn migrate使用方法,这里只做介绍 复制migrate.exe 在使用 NuGet 安装实体框架时,migrate.ex ...
- java 的 sqlHelper,改改之后也适用于不使用 EF 的 C# 项目,包含查询和建表。
这个类用来拼接 sql. package com.ly.orm; public class Query { protected Query(String v) { sql = v; } public ...
- 【SQL】ORACLE在sqlplus中使用spool方式生成建表语句
在实际生产中有时我们需要将一张表的数据导入到另外一张表,如果有PLSQL,我们可以通过PLSQL工具将数据导出为sql脚本,然后再在另外一个数据库中执行这个脚本.但有时在实际生产中我们没有PLSQL这 ...
- ef code first
, 网上有很多的ef code first 的使用的方式,很乱,下面是我自己整理出来的,有什么不正确的地方还请指正,本人菜鸟一枚! 1.新建一个类库 =>引用 右击 管理NuGet程序包 添加 ...
- 优化EF Code First第一次请求速度
由于EF Code First模式没有模型文件,所以很多一次请求的时候速度比较慢,EF需要将对应的数据库映射关系加载到内存里面,往后请求就比较快.可以通过在程序初始化的时候增加一段代码来优化EF第一次 ...
- Entity Framework应用:使用Code First模式管理视图
一.什么是视图 视图在RDBMS(关系型数据库管理系统)中扮演了一个重要的角色,它是将多个表的数据联结成一种看起来像是一张表的结构,但是没有提供持久化.因此,可以将视图看成是一个原生表数据顶层的一个抽 ...
- EF Code First一对一、一对多、多对多关联关系配置
1.EF Code First一对一关联关系 项目结构图: 实体类: Account.cs using System; using System.Collections.Generic; using ...
- MVC项目实践,在三层架构下实现SportsStore-01,EF Code First建模、DAL层等
SportsStore是<精通ASP.NET MVC3框架(第三版)>中演示的MVC项目,在该项目中涵盖了MVC的众多方面,包括:使用DI容器.URL优化.导航.分页.购物车.订单.产品管 ...
- EF应用一:Code First模式
EF的核心程序集位于System.Data.Entity.dll和System.Data.EntityFramework.dll中.支持CodeFirst的位于EntityFramework.dll中 ...
随机推荐
- Java: 类继承中 super关键字
super 关键字的作用有两个: 1)在子类中调用超类的构造器,完成实例域参数的初始化,调用构造器的语句只能作为另一个构造器(通常指的是子类构造器)的第一条语句出现, 2)在子类中调用超类的方法,如: ...
- Fabric 1.0的多机部署
Fabric1.0已经正式发布一段时间了,官方给出的单机部署的脚本也很完备,基本上傻瓜式的一键部署,直接运行官方的network_setup.sh up即可.但是在实际生产环境,我们不可能把所有的节点 ...
- Activiti第三篇【连接、排他网关、指定任务处理人、组任务】
连线 上面我们已将学过了流程变量了,可以在[任务服务.运行时服务.流程开始.完成某个任务时设置流程变量],而我们的连接就是流程变量的实际应用了-. 定义流程图 我们并不是所有的流程都是按一条的路径来走 ...
- Activiti第二篇【管理流程定义、执行任务和流程实例、流程变量】
上篇Activiti只是一个快速入门案例,这篇就讲定义.部署.查看任务等等的一些细节[涉及到的数据库表.对象等等]- 管理流程定义 管理流程定义主要涉及到以下的4张表: -- 流程部署相关的表 SEL ...
- Oracle总结第一篇【基本SQL操作】
前言 在之前已经大概了解过Mysql数据库和学过相关的Oracle知识点,但是太久没用过Oracle了,就基本忘了-印象中就只有基本的SQL语句和相关一些概念-.写下本博文的原因就是记载着Oracle ...
- Oracle SQL*Plus 数据备份为 sql 文件
在某些比较严格的环境中,不提供像PL/SQL Developer 这样的工具供我们备份表数据时,使用SQL*Plus运行如下脚本内容导出数据. 1, 执行时登录SQL*Plus, 命令 @D: ...
- XML功能
REF:https://www.baidu.com/link?url=_-UY8rZVAORlesKTth0F7C8LbvXCL4lSwz6vmQVnTEgmT06NFGdoaD9FbuEQhR7xG ...
- 树状数组(Binary Indexed Tree,BIT)
树状数组(Binary Indexed Tree) 前面几篇文章我们分享的都是关于区间求和问题的几种解决方案,同时也介绍了线段树这样的数据结构,我们从中可以体会到合理解决方案带来的便利,对于大部分区间 ...
- PHP中isset和empty的区别(最后总结)
PHP的isset()函数 一般用来检测变量是否设置 格式:bool isset ( mixed var [, mixed var [, ...]] ) 功能:检测变量是否设置 返回值: 若变量不存在 ...
- hdu1671字典树
Phone List Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...