EF学习和使用(三)Code First
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的更多相关文章
- Entity Framework 学习系列(3) - MySql Code First 开发方式+数据迁移
目录 # 写在前面 一.开发环境 二.创建项目 三.安装程序包 四.创建模型 五.连接字符串 六.编辑程序 七.数据迁移 写在最后 # 写在前面 这几天,一直都在学习Entity Framework ...
- 小菜学习设计模式(三)—工厂方法(Factory Method)模式
前言 设计模式目录: 小菜学习设计模式(一)—模板方法(Template)模式 小菜学习设计模式(二)—单例(Singleton)模式 小菜学习设计模式(三)—工厂方法(Factory Method) ...
- X-Cart 学习笔记(三)X-Cart框架2
目录 X-Cart 学习笔记(一)了解和安装X-Cart X-Cart 学习笔记(二)X-Cart框架1 X-Cart 学习笔记(三)X-Cart框架2 X-Cart 学习笔记(四)常见操作 3.了解 ...
- .NET Remoting学习笔记(三)信道
目录 .NET Remoting学习笔记(一)概念 .NET Remoting学习笔记(二)激活方式 .NET Remoting学习笔记(三)信道 参考:♂风车车.Net .NET Framework ...
- EF学习笔记(十二):EF高级应用场景
学习总目录:ASP.NET MVC5 及 EF6 学习笔记 - (目录整理) 上篇链接:EF学习笔记(十一):实施继承 本篇原文链接:Advanced Entity Framework Scenari ...
- EF学习笔记(九):异步处理和存储过程
总目录:ASP.NET MVC5 及 EF6 学习笔记 - (目录整理) 上一篇:EF学习笔记(八):更新关联数据 本篇原文:Async and Stored Procedures 为何要采用异步? ...
- EF学习和使用综合
一.(引)你必须知道的EF知识和经验 二.(引)EF学习和使用(七)EF性能优化篇 三.(引)采用EntityFramework.Extended 对EF进行扩展(Entity Framework 延 ...
- The Road to learn React书籍学习笔记(第三章)
The Road to learn React书籍学习笔记(第三章) 代码详情 声明周期方法 通过之前的学习,可以了解到ES6 类组件中的生命周期方法 constructor() 和 render() ...
- sql server 关于表中只增标识问题 C# 实现自动化打开和关闭可执行文件(或 关闭停止与系统交互的可执行文件) ajaxfileupload插件上传图片功能,用MVC和aspx做后台各写了一个案例 将小写阿拉伯数字转换成大写的汉字, C# WinForm 中英文实现, 国际化实现的简单方法 ASP.NET Core 2 学习笔记(六)ASP.NET Core 2 学习笔记(三)
sql server 关于表中只增标识问题 由于我们系统时间用的过长,数据量大,设计是采用自增ID 我们插入数据的时候把ID也写进去,我们可以采用 关闭和开启自增标识 没有关闭的时候 ,提示一下错 ...
- JavaWeb和WebGIS学习笔记(三)——GeoServer 发布shp数据地图
系列链接: Java web与web gis学习笔记(一)--Tomcat环境搭建 Java web与web gis学习笔记(二)--百度地图API调用 JavaWeb和WebGIS学习笔记(三)-- ...
随机推荐
- CodeForces - 16E Fish
Discription n fish, numbered from 1 to n, live in a lake. Every day right one pair of fish meet, and ...
- bzoj 2889: Tree Conundrum
2889: Tree Conundrum Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 61 Solved: 37[Submit][Status][ ...
- Akka之BackoffSupervisor
一.背景 最近在开发一个项目,项目的各模块之间是使用akka grpc传输音频帧的,并且各模块中的actor分别都进行了persist.本周在开发过程中遇到了一个bug,就是音频帧在通行一段时间后,整 ...
- NOI模拟题6 Problem C: Circle
Solution 首先这个矩阵, 很明显的就是Vandermonde矩阵. 我们有公式: \[ |F_n| = \prod_{1 \le j < i \le n} (a_i - a_j) \] ...
- linux 项目管理、服务器管理、服务器维护
代码打包:tar -zcvf ImOra.3.2.6.tgz --exclude=Public/.htaccess --exclude=Apps/Demo Apps/ Config/ Shell/ L ...
- Storyboards Tutorial 02
内容中包含 base64string 图片造成字符过多,拒绝显示
- 【spring boot hibernate】hibernate命名策略spring.jpa.hibernate.naming-strategy不起作用
对于 spring.jpa.hibernate.naming-strategy = org.hibernate.cfg.ImprovedNamingStrategy hibernate命名策略设置之后 ...
- Android无需权限显示悬浮窗, 兼谈逆向分析app
前言 最近UC浏览器中文版出了一个快速搜索的功能, 在使用其他app的时候, 如果复制了一些内容, 屏幕顶部会弹一个窗口, 提示一些操作, 点击后跳转到UC, 显示这个悬浮窗不需要申请android. ...
- EasyMvc入门教程-基本控件说明(11)菜单导航
基本上,是个网站就会有菜单导航,目前流行的菜单是不是这样样子的? 似乎是bootstrap引领的风格,我们就用EasyMvc实现吧,上代码: @{ var data = new List<Men ...
- python traceback学习(转)
1. Python中的异常栈跟踪 之前在做Java的时候,异常对象默认就包含stacktrace相关的信息,通过异常对象的相关方法printStackTrace()和getStackTrace()等方 ...