Code First模式我们称之为“代码优先”模式。从某种角度来看。其实“Code First”和“Model First”区别并非太明显。仅仅是它不借助于实体数据模型设计器。而是直接通过编码方式设计实体模型(这也是为什么最開始“Code First”被叫做“Code Only”的原因)。

可是对于EF它的处理过程有所区别,比如我们使用Code First就不再须要EDM文件,全部的映射通过“数据凝视”和“fluent API”进行映射和配置。

另外须要注意的是“Code First”并不表示一定就要手动编写实体类。其实假设有数据库的话能够取巧,通过现有数据库直接生成实体类。


Code First怎样使用


首先

创建一个控制台应用程序。接下来加入两个类“Order”和“OrderDetail”。须要注意的是这两个类有两个导航属性“Order.OrderDetails”和“OrderDetail.Order”:

using System;
using System.Collections.Generic;
namespace CodeFirst
{
public class Order
{
public int Id { get; set; }
public string Customer { get; set; }
public System.DateTime OrderDate { get; set; } public virtual List<OrderDetail> OrderDetails { get; set; }
}
} using System;
using System.Collections.Generic;
namespace CodeFirst
{
public partial class OrderDetail
{
public int Id { get; set; }
public string Product { get; set; }
public string UnitPrice { get; set; }
public int OrderId { get; set; } public virtual Order Order { get; set; }
}
}

其次

有了这两个类之后还须要定义一个数据库上下文,来进行数据操作,这个类必须继承于”System.Data.Entity.DbContext”类。因此接下来我们须要引入EntityFramework包,可通过NuGet进行在线安装。



数据库上下文操作类:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Entity;
namespace CodeFirst
{
public class OrderContext : DbContext
{
public DbSet<Order> Orders { get; set; }
public DbSet<OrderDetail> OrderDetails { get; set; }
} }

測试

然后我们进行測试,在这个类中我们首先创建了一个Order实例,接着编码查询:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace CodeFirst
{
class Program
{
static void Main(string[] args)
{
using (var ctx = new OrderContext())
{
var o = new Order();
o.OrderDate = DateTime.Now;
ctx.Orders.Add(o);
ctx.SaveChanges();
var query = from order in ctx.Orders
select order;
foreach (var q in query)
{
Console.WriteLine("OrderId:{0},OrderDate:{1}", q.Id, q.OrderDate);
}
Console.Read();
}
}
}
}

查询结果如图:


哎等等好像哪里不正确!

咱们明明没有进行不论什么数据库的配置,没有说明往哪个数据库加入。也没有设置连接字符串。可是添加了一条数据,通过查询发现确实保存上了,那么我们的数据究竟在哪呢?其实假设用户不进行数据库配置EF默认会使用“.\SQLEXPRESS”数据库实例,假设你没有安装“.\SQLEXPRESS”则默认使用LocalDb。关于LocalDb的详细细节请看:SQL Server 2012 Express LocalDB,通常会存放在文件夹:“C:\Users\username”,能够看到创建了一个名为“CodeFirst.OrderContext”的数据库:


可是正常情况下我们是须要自己控制建立数据库的,比如我想让他保存在某台server上。而且数据库的名字是“CodeFirstDb”,此时我们就须要在配置文件App.Config中配置一个数据库连接串,然后在我们的数据库上下文中指定这个连接名称。



在配置文件里加入:

  <connectionStrings>
<add name="CodeFirstDb" connectionString="Data Source=.;Database=CodeFirstDb;UID=sa;PWD=123456;" providerName="System.Data.SqlClient"></add>
</connectionStrings>

改动OrderContext类:

构造函数多了一个连接名參数:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Entity;
namespace CodeFirst
{ public class OrderContext : DbContext
{
public OrderContext(string connectionName)
: base(connectionName) { } public DbSet<Order> Orders { get; set; }
public DbSet<OrderDetail> OrderDetails { get; set; }
}
}

client使用:

传入配置的数据库连接字符串名称:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace CodeFirst
{
class Program
{
static void Main(string[] args)
{
using (var ctx = new OrderContext("CodeFirstDb"))
{
var o = new Order();
o.OrderDate = DateTime.Now;
ctx.Orders.Add(o);
ctx.SaveChanges();
var query = from order in ctx.Orders
select order;
foreach (var q in query)
{
Console.WriteLine("OrderId:{0},OrderDate:{1}", q.Id, q.OrderDate);
}
Console.Read();
}
}
}
}

运行结果:

运行之后就会发如今server上多了一个“CodeFirstDb”数据库:


三种模型的比較:

上图很清晰的描写叙述了,三种模式的适用环境以及各自的特性,关于这三种方式并没有什么优劣,在应用的时候考虑项目本身的情况决定就可以。但值得一说的是CodeFirst的特性:运行时自己主动创建数据库。这一特性恰恰能够满足互联网软件多租户(云)的须要。兴许博客中会详细说明。

代码下载

EF学习和使用(三)Code First的更多相关文章

  1. Entity Framework 学习系列(3) - MySql Code First 开发方式+数据迁移

    目录 # 写在前面 一.开发环境 二.创建项目 三.安装程序包 四.创建模型 五.连接字符串 六.编辑程序 七.数据迁移 写在最后 # 写在前面 这几天,一直都在学习Entity Framework ...

  2. 小菜学习设计模式(三)—工厂方法(Factory Method)模式

    前言 设计模式目录: 小菜学习设计模式(一)—模板方法(Template)模式 小菜学习设计模式(二)—单例(Singleton)模式 小菜学习设计模式(三)—工厂方法(Factory Method) ...

  3. X-Cart 学习笔记(三)X-Cart框架2

    目录 X-Cart 学习笔记(一)了解和安装X-Cart X-Cart 学习笔记(二)X-Cart框架1 X-Cart 学习笔记(三)X-Cart框架2 X-Cart 学习笔记(四)常见操作 3.了解 ...

  4. .NET Remoting学习笔记(三)信道

    目录 .NET Remoting学习笔记(一)概念 .NET Remoting学习笔记(二)激活方式 .NET Remoting学习笔记(三)信道 参考:♂风车车.Net .NET Framework ...

  5. EF学习笔记(十二):EF高级应用场景

    学习总目录:ASP.NET MVC5 及 EF6 学习笔记 - (目录整理) 上篇链接:EF学习笔记(十一):实施继承 本篇原文链接:Advanced Entity Framework Scenari ...

  6. EF学习笔记(九):异步处理和存储过程

    总目录:ASP.NET MVC5 及 EF6 学习笔记 - (目录整理) 上一篇:EF学习笔记(八):更新关联数据 本篇原文:Async and Stored Procedures 为何要采用异步? ...

  7. EF学习和使用综合

    一.(引)你必须知道的EF知识和经验 二.(引)EF学习和使用(七)EF性能优化篇 三.(引)采用EntityFramework.Extended 对EF进行扩展(Entity Framework 延 ...

  8. The Road to learn React书籍学习笔记(第三章)

    The Road to learn React书籍学习笔记(第三章) 代码详情 声明周期方法 通过之前的学习,可以了解到ES6 类组件中的生命周期方法 constructor() 和 render() ...

  9. sql server 关于表中只增标识问题 C# 实现自动化打开和关闭可执行文件(或 关闭停止与系统交互的可执行文件) ajaxfileupload插件上传图片功能,用MVC和aspx做后台各写了一个案例 将小写阿拉伯数字转换成大写的汉字, C# WinForm 中英文实现, 国际化实现的简单方法 ASP.NET Core 2 学习笔记(六)ASP.NET Core 2 学习笔记(三)

    sql server 关于表中只增标识问题   由于我们系统时间用的过长,数据量大,设计是采用自增ID 我们插入数据的时候把ID也写进去,我们可以采用 关闭和开启自增标识 没有关闭的时候 ,提示一下错 ...

  10. JavaWeb和WebGIS学习笔记(三)——GeoServer 发布shp数据地图

    系列链接: Java web与web gis学习笔记(一)--Tomcat环境搭建 Java web与web gis学习笔记(二)--百度地图API调用 JavaWeb和WebGIS学习笔记(三)-- ...

随机推荐

  1. Ruby 定时任务之一(初步尝试)

    最近工作需要用到定时任务.原来写java的时候也用到过类似的Scheduler的功能. Ruby语言中也有同样功能的工具.rufus-scheduler.下面介绍一下rufus-scheduler. ...

  2. Scut游戏服务器引擎6.0.5.1发布

    1. 修正缓存删除时不会更新到Redis的问题 2. 修正Model组合3个以上子类时Change事件未绑定的问题 3. 修正中间层MySql与MsSql数据库Sql语句分页问题

  3. TOYS-POJ2318

    本题主要是确定给定的点在那块区域.原题给出n条直线,将长方形分为n+1快区域.我们可以对每个给定的点来判断它在那块区域,判段方法可以根据点与直线的位置关系,具体如下,对于点(x0,y0)和直线ax+b ...

  4. 亿图图示专家V7破解版

    “破解文件”目录下的三个文件拷贝出来复制到安装目录下即可: 下载链接地址: http://cloud.suning.com/cloud-web/share/link.htm?sk=718100ef90 ...

  5. 【Salvation】——项目进展&已取得的成果

    写在前面:这个项目为原创团体项目,其中美术设计与部分关卡功能为其他成员完成,我负责的部分以角色动画和登录注册为主. 一.游戏美术设计 游戏背景,道具,动物,人物帧动画制作全部完成. 1.人物 2.游戏 ...

  6. VELT-0.1.5开发:在VS2013下进行python开发

    快乐虾 http://blog.csdn.net/lights_joy/(QQ群:Visual EmbedLinux Tools 375515651) 欢迎转载,但请保留作者信息 本文仅适用于vs20 ...

  7. vs:如何添加.dll文件

    Newtonsoft.Json.dll  一个第三方的json序列化和反序列化dll,转换成json供页面使用,页面json数据转换成对象,供.net使用 Mysql.Data.dll  mysql数 ...

  8. Node.js 把抓取到的电影节目列表单发或者群发到QQ邮箱

    代码地址如下:http://www.demodashi.com/demo/12381.html 一.前言 上一节我们演示了如何用Node的各种包去抓取电影天堂最新电影列表,接下来我们会讲解如何发送我们 ...

  9. 转jmeter 性能测试 JDBC Request (查询数据库获取数据库数据) 的使用

    JDBC Request 这个Sampler可以向数据库发送一个jdbc请求(sql语句),并获取返回的数据库数据进行操作.它经常需要和JDBC Connection Configuration配置原 ...

  10. 26最小公倍数 lowest common multiple

    题目描述 正整数A和正整数B 的最小公倍数是指 能被A和B整除的最小的正整数值,设计一个算法,求输入A和B的最小公倍数. 输入描述:输入两个正整数A和B. 输出描述:输出A和B的最小公倍数. 输入例子 ...