[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是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在VS中 画模型图,来生成数据库和Object,不方便控制数据库。
这2个都会产生edmx文件(xml),包含SSDL(数据定义),CSDL(类定义),CS Mapping(数据类映射)
在edmx模型查看中,不会把所有表都显示。当2个表的关系为多对多的时候,关系表会由一条多对多的线来表示。
在Model Browser中,可以看到存储过程,视图等非表的信息。
在EF7中,只有Code Only 说明Code First的重要性。在使用中,中小型项目,我也推荐使用,毕竟开发效率提高了不止一点点。
创建POCO
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 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
1 2 3 4 5 6 7 8 9 10 | 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>
Main方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 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(); } } |
连接数据库,查看数据库。
在EF中,DbContext相当于一个数据库,DbSet则相当于一个数据表或者视图。
当业务改变,POCO类需要改变,表也需要改变。
EF的数据迁移通过 NuGet 来进行。
打开程序包管理器控制台(Package Manager Console),键入“get-help EntityFramework”命令,可以获得相关的帮助信息。
Enable-Migrations [-Force]
Add-Migration
Update-Database
Get-Migrations
如:加一个Title属性
1 2 3 4 5 6 7 | 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 ; } } |
启动迁移功能
文件结构
生成改变
如果觉得太麻烦,可以使用以下方式
1 2 3 4 5 6 7 8 9 10 | 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 ; } } |

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 }
对于一个ORM框架,支持事务操作是必须的。
我们的每一次SaveChanges就是一个事务操作,只需要在所有更改都完成后,调用这个方法就可以了。
如果你不愿意,可以手动的开启事务的代码 :
DbConnection con = ((IObjectContextAdapter)ctx).ObjectContext.Connection;
con.Open();
using (var tran = con.BeginTransaction())
{
// 这里才是事务中的代码
tran.Commit();
}
con.Close();
以上是针对一个DbContext,也就是一个数据库的时候,如果操作涉及到多个数据库,还是使用分布式事务操作比较靠谱。
使用分布式事务处理,需要Windows系统的支持,所以,我们需要将系统的MSDTC服务开启。
代码下载:EFTest.zip
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义