概述

   在项目一开始,没有数据库时,可以借助 EF 设计模型,然后根据模型同步完成数据库中表的创建,这就是 Model First 开发方式。

   总结一点就是:现有模型再有表。

创建 Model First Demo

  创建 Model First 的步骤如下:

  (1)创建控制台项目

     右击解决方案 “EFDemo”,选择 “添加项目 → 控制台应用程序”,并将项目命名为 ModelFirst。

  (2)添加 ADO.NET 实体模型

     右击 ModelFirst 项目,再选择 “添加新建项 → ADO.NET 实体数据模型” 并命名为 ModelFirstModel.edmx,创建空模型后单击 “完成”。

  (3)添加实体 Customer

     ① 添加实体和几个必要的测试字段。切记,一定要添加主键。主键既可以是自增长的数字类型,也可以是 Guid 类型。

        右击空白处 → 新增 → 实体。

        实体名称(Customer),实体集(Customer),确定。

     ② 添加标量属性。

        标量属性可以看成数据库中的普通字段(主键和外键之外的)。

        我们在设计字段属性的时候,一定要记得设置其最大范围,否则最终会生成一个比较大的默认范围,严重影响性能,并占用不必要的磁盘空间。

        右击实体 → 新增 → 标量属性。

        注意:“名称”、“可以为 Null”、“类型”、“最大长度”。

     ID 属性:ID 是实体键(主键,类型为 Int32,实体键设为True),存储方式是自增长(Identity)。  (属性 “实体键”,表示设置主键)

     (String 可以选择是否采用 Unicode 编码,如果采用就对应 SQL Server 中的 nvarchar 类型)

     (Decimal 表示指定小数位数及数据精度的类型,范围表示小数个数,精度显示总的数据位数)

  (4)添加实体之间的联系

     再添加一个实体 Product:右击空白处 → 新增 → 实体,属性类型设为 Guid。

     自增长主键和 Guid 主键的比较:

       Guid 比自增长要快,因为自增长会先查询表中最大的 ID,然后锁表,再在这个最大的 ID 基础上加 1,然后插入数据表。

       自增长也有自己的长处,比如占用空间小,因为它是 int 类型的,而 Guid 一般是 32 或 64 个字符长度。还有就是比较清晰,不像 Guid 那么大。如果涉及数据迁移,自增长主键就会变得非常不方便,而 Guid 的优势则非常明显。

     再依次添加标量属性 Name、Price、Weight。

     然后添加实体 Order 以及标量属性 OrderNO、Amount、CreateTime。

     接着,我们添加两个实体之间的关联,右击工作面板空白处 → 新增 → 关联,在 “添加关联” 对话框中进行设置。(设置实体表以及多重性关系,同时保证两个都勾选导航属性)

       Customer 实体和 Order 实体上面的导航属性不要去掉,因为后面用它来查询将会变得非常方便。

       导航属性,顾名思义,就是根据这个属性可以找到一个和它关联的对象实体。

     然后,我们再添加 Customer 和 Product 多对多的关联。

     关于 “关联”  的说明如下:

       1:1,性能低(不会延迟加载,添加时必须同时创建两个对象),尽量不要使用,可以自己实现逻辑代码完成这种操作。(查看一下表结构,可以发现本质还是 1:m 的结构)

       1:m

       M:n:可以手动创建中间表采用 1:m 关系,也可以直接使用此种关系,EF 会自动创建中间表。

       在创建关联时,可以选择是否要创建导航属性、外键。

     添加完成之后,按 Ctrl + S 组合键,会在 ModelFirstModel.edmx 中 ModelFirstModel.tt 下面生成 Customer、Order 和 Product 三个类。(.tt 后缀的文件为 T4 模板,会面会单独讲解)(如果没有还是可以继续执行的)

  (5)根据模型创建数据库

     右击工作区空白处,根据模型生成数据库,将数据库命名为 ModelFirstDB,并执行 SQL 脚本创建数据库。

     单击 “根据模型生成数据库” 操作后选择数据源、填写服务器名、选择或输入数据库名称(如果没有将会提示新建),单击 “确定” 按钮。

     单击 “下一步 → 完成”,生成 DLL脚本,然后执行生成的 DLL 脚本。(执行 DLL 脚本完成后,我们会看到数据库中出现了 4 张表,其中 CustomerProduct 表是 EF 为了实现多对多关系而自动创建的)

  (6)导航属性的应用

    ① 创建测试数据。

      要先添加 Customer 实体的数据,因为 Order 实体和 Product 实体都引用了 Customer 实体。

        static void AddTestData()
{
using (ModelFirstModelContainer db = new ModelFirstModelContainer())
{
Customer cus = new Customer
{
Name = "楚留香",
Age = ,
CompanyName = "大旗门",
Telphone = ""
}; Order order1 = new Order
{
Amount = ,
CreateTime = DateTime.Now,
OrderNO = "",
CustomerId = cus.Id
}; Order order2 = new Order
{
Amount = ,
CreateTime = DateTime.Now,
OrderNO = "",
Customer = cus
}; Product prod = new Product
{
ID = Guid.NewGuid(),
Name = "牛栏1段",
Price = ,
Weight = ,
Customer = new List<Customer>() { cus }
}; db.Customer.Add(cus);
db.Product.Add(prod);
db.Order.Add(order1);
db.Order.Add(order2); if(db.SaveChanges() > ) //db.SaveChanges()默认是已经开启了事务的,而且在这之前都只进行了一次数据库的连接,这种类似于批处理的操作大大地提升了性能。
{
Console.WriteLine("添加成功!");
}
else
{
Console.WriteLine("添加失败!");
}
}
}

    注意:db.SaveChanges() 默认是已经开启了事务的,而且在这之前都只进行了一次数据库的连接,这种类似于批处理的操作大大地提升了性能。

  ② 查询客户楚留香的所有订单信息:

        static void SearchCusOrder()
{
using (ModelFirstModelContainer db = new ModelFirstModelContainer())
{
var orderList = from o in db.Order where o.Customer.Name == "楚留香" select o;
Console.WriteLine("客户楚留香的所有订单如下:"); orderList.ToList().ForEach(o => Console.WriteLine(string.Format("订单号:{0},订单金额:{1},订单创建时间:{2}", o.OrderNO, o.Amount, o.CreateTime)));
Console.ReadKey();
}
}

    这里先查 Order 表信息,然后直接通过导航属性 Customer 来过滤信息。

    当然,我们也可以通过使用 Join 来查询,达到同样的查询效果。

                var orderList = from c in db.Customer join o in db.Order on c.Id equals o.CustomerId where c.Name == "楚留香" select o;

    那么,什么时候使用 join 查询,什么时候使用导航属性查询呢?

    导航属性就相当于 SQL 中的子查询。Join 查询和 SQL 中的 Inner Join 查询一样,所以当两张表的数据量都大的时候就使用导航属性查询,在数据量不大的情况下使用 join 查询

Model First 开发方式的更多相关文章

  1. Entity Framework之Model First开发方式

    一.Model First开发方式 在项目一开始,就没用数据库时,可以借助EF设计模型,然后根据模型同步完成数据库中表的创建,这就是Model First开发方式.总结一点就是,现有模型再有表. 二. ...

  2. WEB三层架构与MVC

    web三层架构是指: >用户接口层(UI Layer) >业务逻辑层(Bussiness Layer) >持久化层 关于业务逻辑和用户接口 在早期的web开发中,因为业务比较简单,并 ...

  3. 三层架构与MVC

    三层简介 先说说Web三层架构这个古老话题.地球人都知道web三层架构是指: • >用户接口层(UI Layer) • >业务逻辑层(Bussiness Layer) • >持久化层 ...

  4. ModelFirst开发

    首先介绍一下ModelFirst开发方式,什么时候才用呢!在没有数据库时,可以借助EF设计模型,然后根据模型同步完成数据库中表的创建,这就是Model First开发方式,简而言之就是先有模型再有表. ...

  5. Django——WEB三层架构与MVC

    而我发此文的目的有二:一者,让初学者能够听到一家之言,是为解惑:二者,更希望抛砖引玉,得到专家的批判. 许多学生经常问我,MVC到底和WEB三层架构有啥关系? 开始时,我也只能给他们一些模糊的回答.时 ...

  6. Spring Boot笔记一

    Spring Boot 入门 Spring Boot 简介 > 简化Spring应用开发的一个框架:> 整个Spring技术栈的一个大整合:> J2EE开发的一站式解决方案: 微服务 ...

  7. 6、ASP.NET MVC入门到精通——ASP.Net的两种开发方式

    本系列目录:ASP.NET MVC4入门到精通系列目录汇总 目前,ASP.NET中两种主流的开发方式是:ASP.NET Webform和ASP.NET MVC.从下图可以看到ASP.NET WebFo ...

  8. atitit.提升开发效率---MDA 软件开发方式的革命(3)----自动化建表

    atitit.提升开发效率---MDA 软件开发方式的革命(3)----自动化建表 1. 建模在后自动建表 1 1. 传统上,需要首先建表,在业务编码.. 1 2. 模型驱动建表---更多简化法是在建 ...

  9. atitit.提升开发效率---mda 软件开发方式的革命

    atitit.提升开发效率---mda 软件开发方式的革命 1. 软件开发方式的革命开发工具的抽象层次将再次提升 1 2. 应用框架和其实现相分离 2 3. 目前的问题模型和代码不同步 2 4. MD ...

随机推荐

  1. 2018-2019-2 《网络对抗技术》Exp2 后门原理与应用 20165215

    目录 实验内容 基础问题回答 常用后门工具 Netcat windows 获取 linux 的shell linux 获取 winsdows 的shell 使用nc传输数据 使用nc传文件 Socat ...

  2. decimal(19,6)什么意思

    decimal(19,6)什么意思 数字长度19位,精确到小数点后6位例如0.123456 mysql中varchar(50)最多能存多少个汉字 首先要确定mysql版本4.0版本以下,varchar ...

  3. Linux高效数据统计命令wc

    wc(world count)是一个统计文件字词,字节,行数的命令,它可以帮我们非常方便的统计以上信息. 主要参数 常见参数如下: -c 统计字节数. -l 统计行数. -m 统计字符数.这个标志不能 ...

  4. 在自定义目录下,按日期创建excel文件

    在指定文件目录下,新建以当前日期命名的excel 文件,如果文件已经存在,在文件中新建一个sheet页来存放数据 import datetime import xlrd, xlwt import re ...

  5. Linux下使用acme.sh 配置https 免费证书

    acme.sh 简单来说acme.sh 实现了 acme 协议, 可以从 let‘s encrypt 生成免费的证书.acme.sh 有以下特点:一个纯粹用Shell(Unix shell)语言编写的 ...

  6. setInterval中this

    今天使用react做钟表,自然用到了setInterval,但是出现this指向不明的问题. <html> <head> <meta charset="UTF- ...

  7. 解析docker中的环境变量使用和常见问题解决

    docker容器中的环境变量 docker可以为容器配置环境变量.配置的途径有两种: 在制作镜像时,通过ENV命令为镜像增加环境变量.在容器启动时使用该环境变量. 在容器启动时候,通过参数配置环境变量 ...

  8. Java基础学习-Random类和Java数组

    1.随机数类(Random) package com.denniscui;   import java.util.Random; /*  * Random:用于产生随机数  *  * 使用步骤:  * ...

  9. Numpy 基础

    Numpy 基础 参考https://www.jianshu.com/p/83c8ef18a1e8 import numpy as np 简单创建数组 # 创建简单列表 a = [1, 2, 3, 4 ...

  10. 支付宝支付之App支付

    与微信支付对比,支付宝支付就没有那么多坑了,毕竟支付宝开放平台的文档还是描述的很详细的. 支付宝开放平台地址:https://docs.open.alipay.com/204/105297/ 支付宝支 ...