今天在学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模式不同建模方式对建表产生的影响的更多相关文章

  1. 使用ef code first模式,在部署后服务器端把数据库同步到最新版本的方法

    共有两种方法: 1.使用migrate.exe 具体使用方法请参考 msdn migrate使用方法,这里只做介绍 复制migrate.exe 在使用 NuGet 安装实体框架时,migrate.ex ...

  2. java 的 sqlHelper,改改之后也适用于不使用 EF 的 C# 项目,包含查询和建表。

    这个类用来拼接 sql. package com.ly.orm; public class Query { protected Query(String v) { sql = v; } public ...

  3. 【SQL】ORACLE在sqlplus中使用spool方式生成建表语句

    在实际生产中有时我们需要将一张表的数据导入到另外一张表,如果有PLSQL,我们可以通过PLSQL工具将数据导出为sql脚本,然后再在另外一个数据库中执行这个脚本.但有时在实际生产中我们没有PLSQL这 ...

  4. ef code first

    , 网上有很多的ef  code first 的使用的方式,很乱,下面是我自己整理出来的,有什么不正确的地方还请指正,本人菜鸟一枚! 1.新建一个类库 =>引用 右击 管理NuGet程序包 添加 ...

  5. 优化EF Code First第一次请求速度

    由于EF Code First模式没有模型文件,所以很多一次请求的时候速度比较慢,EF需要将对应的数据库映射关系加载到内存里面,往后请求就比较快.可以通过在程序初始化的时候增加一段代码来优化EF第一次 ...

  6. Entity Framework应用:使用Code First模式管理视图

    一.什么是视图 视图在RDBMS(关系型数据库管理系统)中扮演了一个重要的角色,它是将多个表的数据联结成一种看起来像是一张表的结构,但是没有提供持久化.因此,可以将视图看成是一个原生表数据顶层的一个抽 ...

  7. EF Code First一对一、一对多、多对多关联关系配置

    1.EF Code First一对一关联关系 项目结构图: 实体类: Account.cs using System; using System.Collections.Generic; using ...

  8. MVC项目实践,在三层架构下实现SportsStore-01,EF Code First建模、DAL层等

    SportsStore是<精通ASP.NET MVC3框架(第三版)>中演示的MVC项目,在该项目中涵盖了MVC的众多方面,包括:使用DI容器.URL优化.导航.分页.购物车.订单.产品管 ...

  9. EF应用一:Code First模式

    EF的核心程序集位于System.Data.Entity.dll和System.Data.EntityFramework.dll中.支持CodeFirst的位于EntityFramework.dll中 ...

随机推荐

  1. 201521123014 《Java程序设计》第14周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多数据库相关内容. 数据库是为了实现一定目的按某种规则组织起来的"数据"的"集合".常见的数 ...

  2. JMeter关联(正则表达式提取器)

    关联:与系统交互过程中,系统返回的内容,需要在接下来的交互中用到,如防止csrf攻击而生成的token. 从前一个请求中取,用Regular Expression Extractor 正则表达式提取器 ...

  3. [android游戏开发初学]SurfaceView初探之缓冲区测试

    先上测试代码 private static class PathView extends SurfaceView implements SurfaceHolder.Callback{ private ...

  4. Linux Ubuntu从零开始部署web环境及项目 -----部署项目 (三)

    上一篇讲了如何在linux搭建web环境,这边将如何部署项目. 1,打包项目包 2,上传项目包 将.war项目包通过xftp上传到tomcat目录wabapps目录下 3,启动项目 通过xshell命 ...

  5. Java对象大小:size和retained size

    最近看到网上很多文章讲如何计算java对象的大小(size),很多观点不敢苟同. 这是其中一篇比较靠前的文章,写的也比较全面: http://blog.csdn.net/iter_zc/article ...

  6. 1.在CentOS 6.4安装python3

    CentOS安装Python3.X 1.系统环境说明 [root@Python ~]# uname -r 2.6.32-431.el6.i686 [root@Python ~]# uname -m i ...

  7. AES加解密算法Qt实现

    [声明] (1) 本文源码 在一位未署名网友源码基础上,利用Qt编程,实现了AES加解密算法,并添加了文件加解密功能.在此表示感谢!该源码仅供学习交流,请勿用于商业目的. (2) 图片及描述 除图1外 ...

  8. 【JVM命令系列】javap

    命令基本概述 javap是JDK自带的反汇编器,可以查看java编译器为我们生成的字节码.通过它,可以对照源代码和字节码,从而了解很多编译器内部的工作.可以在命令行窗口先用javap -help看下j ...

  9. Win7 32位系统下Sublime text 3的安装以及配置C/C++、java、python的开发环境方法

    本人初学者,此文仅是对这几天鼓捣subime text 3一点微不足道的经验总结,如有明显错误,欢迎指正! 好了,废话少说,进入正题,之前编程java一直用的是eclipse,java的主流IDE,后 ...

  10. Keyboard Row

    Given a List of words, return the words that can be typed using letters of alphabet on only one row' ...