[ORM] Entity Framework(1) CodeFirst快速入门
Entity Framework 是微软以 ADO.NET 为基础所发展出来的对象关系对应 (O/R Mapping) 解决方案
对象关系映射(英语:Object Relational Mapping,简称ORM),是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。
下载:Install-Package EntityFramework -Version 6.1.3 (7.0只有CodeOnly模式)
本节技术概览:数据库的安装,DB First,Model First,Code First(重点),DbContext,DbSet,CRUD例子,数据迁移以及事务管理。
LocalDB和SQL Server安装
LocalDb是visual studio自带的,用来开发使用。运行是采用进程形式而非服务形式。
位置:C:\Program Files\Microsoft SQL Server\110\Tools\Binn\SqlLocalDB.exe(这是vs 2013的位置,使用VS2013开发人员工具输入sqllocaldb即可)
SQL Server采用服务方式,方便连接管理。可以去itellyou.cn下载。
连接
可以直接用vs连接这2种数据库。连接localdb

DB First,Model First

DB First采用通常的数据库先行的办法,常见,稳定。基本下一步下一步就能完成。
Model First在VS中 画模型图,来生成数据库和Object,不方便控制数据库。
这2个都会产生edmx文件(xml),包含SSDL(数据定义),CSDL(类定义),CS Mapping(数据类映射)
在edmx模型查看中,不会把所有表都显示。当2个表的关系为多对多的时候,关系表会由一条多对多的线来表示。
在Model Browser中,可以看到存储过程,视图等非表的信息。
CodeFirst
在EF7中,只有Code Only 说明Code First的重要性。在使用中,中小型项目,我也推荐使用,毕竟开发效率提高了不止一点点。
创建POCO
public class App
{
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<AppData> AppDatas { get; set; }
} public class AppData
{
public int Id { get; set; }
public string Name { get; set; }
public string Value { get; set; }
public virtual App App { get; set; }
}
创建DbContext
public class AppContext : DbContext
{
public AppContext()
: base("AppDb") //AppDb数据库库名
{ }
public DbSet<App> Apps { get; set; }
public DbSet<AppData> AppDatas { get; set; }
}
文件结构:

app.config
<configuration>
<configSections>
<!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
</configSections>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>
<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
<parameters>
<parameter value="mssqllocaldb" />
</parameters>
</defaultConnectionFactory>
<providers>
<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
</providers>
</entityFramework>
</configuration>
App.Config
Main方法
static void Main(string[] args)
{
using (var ctx = new AppContext())
{
var app = new App() { Name = "博客园" };
var data = new[]
{
new AppData() {Name = "最新博客", Value = "XX", App = app},
new AppData() {Name = "48小时阅读排行", Value = "YY", App = app}
};
ctx.Apps.Add(app);
ctx.AppDatas.AddRange(data);
ctx.SaveChanges();
}
}
连接数据库,查看数据库。

DbContext,DbSet
在EF中,DbContext相当于一个数据库,DbSet则相当于一个数据表或者视图。
数据迁移
当业务改变,POCO类需要改变,表也需要改变。
EF的数据迁移通过 NuGet 来进行。
打开程序包管理器控制台(Package Manager Console),键入“get-help EntityFramework”命令,可以获得相关的帮助信息。
Enable-Migrations [-Force]
Add-Migration
Update-Database
Get-Migrations
如:加一个Title属性
public class App
{
public int Id { get; set; }
public string Name { get; set; }
public string Title { get; set; } //add prop
public virtual ICollection<AppData> AppDatas { get; set; }
}
启动迁移功能

文件结构

生成改变

如果觉得太麻烦,可以使用以下方式
public class AppContext : DbContext
{
public AppContext()
: base("AppDb") //AppDb数据库库名,也可以换成连接字符串
{
Database.SetInitializer(new DropCreateDatabaseIfModelChanges<AppContext>());
}
public DbSet<App> Apps { get; set; }
public DbSet<AppData> AppDatas { get; set; }
}
CRUD例子:
using (var ctx = new AppContext())
{
//crud
#region create
var app = new App() { Name = "博客园" };
var data = new[]
{
new AppData() {Name = "最新博客", Value = "XX", App = app},
new AppData() {Name = "48小时阅读排行", Value = "YY", App = app}
};
ctx.Apps.Add(app);
ctx.AppDatas.AddRange(data);
ctx.SaveChanges();
#endregion #region update
app.Name = "Never、C";
ctx.SaveChanges();
//or
ctx.Apps.AddOrUpdate(app);
#endregion #region read
app = ctx.Apps.FirstOrDefault(o => o.Name == "博客园");
Console.WriteLine(app);
#endregion #region delete
ctx.Apps.Remove(app);
#endregion
}
EF CRUD
事务管理
对于一个ORM框架,支持事务操作是必须的。
我们的每一次SaveChanges就是一个事务操作,只需要在所有更改都完成后,调用这个方法就可以了。
如果你不愿意,可以手动的开启事务的代码 :
DbConnection con = ((IObjectContextAdapter)ctx).ObjectContext.Connection;
con.Open();
using (var tran = con.BeginTransaction())
{
// 这里才是事务中的代码
tran.Commit();
}
con.Close();
以上是针对一个DbContext,也就是一个数据库的时候,如果操作涉及到多个数据库,还是使用分布式事务操作比较靠谱。
使用分布式事务处理,需要Windows系统的支持,所以,我们需要将系统的MSDTC服务开启。
代码下载:EFTest.zip
[ORM] Entity Framework(1) CodeFirst快速入门的更多相关文章
- [ORM] Entity Framework(2) CodeFirst进阶
在上一节中,实现了CodeFirst快速入门.但是很多与数据库的细节还无法自定义.以及使用EF过程中,需要注意的事项. 在本节中,会涉及到以下 EF中的连接字符串 EF的对象状态 延迟加载,为什么需要 ...
- 实体框架Entity Framework 4.1快速入门
介 绍 在旧的Entity 框架中,开发者可以从已存在的数据库中产生业务实体的模型,这种开发方法被称为数据库驱动的开发方法.而在4.1的Entity Framework中,支开发者先创建实体业务类,然 ...
- 在Oracle中使用Entity Framework 6 CodeFirst
项目中需要将系统从SQLServer数据库迁移到Oracle上.由于原大部分数据访问操作都是通过包装了Entity Framework的统一访问入口实现的,所以需要研究Entity Framework ...
- [转]Using Entity Framework (EF) Code-First Migrations in nopCommerce for Fast Customizations
本文转自:https://www.pronopcommerce.com/using-entity-framework-ef-code-first-migrations-in-nopcommerce-f ...
- C# ORM—Entity Framework 之Code first(代码优先)(二)
一.Entity Framework Code first(代码优先)使用过程 1.1Entity Framework 代码优先简介 不得不提Entity Framework Code First这个 ...
- [EF1]POCOs(Plain Old C# Object)Entity Framework 4.x: POCOs入门
原文链接:http://www.cnblogs.com/hjzhang/archive/2011/05/18/2050530.html POCOs 是在Visual Studio 2010和ASP.N ...
- C# ORM—Entity Framework 之Database first(数据库优先)&Model First(模型优先)(一)
一.什么是Entity Framework 1.1 实体框架(EF)是一个对象关系映射器,使.NET开发人员使用特定于域的对象与关系数据.它消除了需要开发人员通常需要编写的大部分数据访问代码.简化了原 ...
- ASP.NET Core 入门教程 8、ASP.NET Core + Entity Framework Core 数据访问入门
一.前言 1.本教程主要内容 ASP.NET Core MVC 集成 EF Core 介绍&操作步骤 ASP.NET Core MVC 使用 EF Core + Linq to Entity ...
- Entity Framework - PostgresQL CodeFirst
经过几年的更新及业界对Entity Framework 的认同. 现在 EF 可以支持的数据库越来越多了.而PostgresQL 数据库现在也可以使用code first的方式来创建数据库了. 不多说 ...
随机推荐
- 田渊栋:AlphaGo系统即使在单机上也有职业水平
Facebook人工智能组研究员田渊栋博士在知乎专栏上更新了一篇文章,详细分析了AlphaGo在<自然>杂志上发表的论文,他认为AlphaGo整个系统即使在单机上也已具有了职业水平,与李世 ...
- Andriod Studio 开发环境安装和配置
Android Studio安装配置详细步骤(图文):http://www.2cto.com/kf/201604/500642.html第一次使用Android Studio时你应该知道的一切配置 : ...
- 第六章 - 图像变换 - 图像拉伸、收缩、扭曲、旋转[2] - 透视变换(cvWarpPerspective)
透视变换(单应性?)能提供更大的灵活性,但是一个透视投影并不是线性变换,因此所采用的映射矩阵是3*3,且控点变为4个,其他方面与仿射变换完全类似,下面的例程是针对密集变换,稀疏图像变换则采用cvPer ...
- 网页内容导出word/excel的js代码
IE设置: 工具-> Internet选项-> 安全->自定义级别-> 对没有标记安全级别的ActiveX控件进行初始化 设为启用! 1.导出word //指定区域导出到Wo ...
- Linux 输出文件列数,拼接文件
如果我只想看看文件的前几行,每行的字段数(列数),我的文件已tab作为分隔符(这个可以自己指定),其具体命令如下: head fileName | awk -F'\t' '{print NF}' 如果 ...
- HL AsySocket 服务开发框架 - 业务逻辑层
一 概述 Socket服务只是提供一个网络传输服务. 业务逻辑层在整体架构中的位置在那里呢,如图: 网络层将解包后的消息包抛至业务逻辑层,业务逻辑层收到消息包后,解析消息类型,然后转入相应的处理流程处 ...
- ServiceManager 小结
1 ServiceManger 根据name优先从Map中获取IBinder,例如AMS.WMS.PMS:如果Map中没有对应的IBinder,我们获取Serviceanager的代理ServiceM ...
- tensorflow 运行成功!
折腾了一天安装tensorflow环境,终于可以运行,也记录一下安装中容易犯的错误总结(写给python小白们) 一.win7 双系统 安装ubuntu 16.04 ,参考 http://jingya ...
- mvc 分页视图 js 失效
MVC的分页视图确实是好东西,比ajax直观,可是联动后 之前绑定的js事件失效,所以我们在绑定的时候,要注意使用jquery的 动态绑定功能 最常见的用法应该是 select 的 change 事件 ...
- swift 闭包
闭包可以捕获和存储其所在上下文中任意常量和变量的引用. 这就是所谓的闭合并包裹着 这些常量和变量,俗称闭包. Swift标准库中提供了sort排序函数,sort函数的第二个参数是个闭包.和OC中的bl ...