Entity Framework是微软官方提供的一个ORM解决方案,它有纯正的血统,比NHibernate更容易使用并且与现有其它官方框架配合更加密切。
时代不断的在发展变化,记得10年前还是ADO(配合ASP)的天下,后来微软推出了ADO.NET,再后来推出了ADO.NET Entity Framework,可见微软在.NET与数据库交互领域的作为。
下面我将以Entity Framework(简称EF)来演示一下在C#当中如何使用好这个非常“爽”的ORM工具。我们以大家比较熟悉的模型—学生和课程的多对多的关系(学生可以选择多门课程、课程有可能有多个学生选择)来进行演示。
第一步,建立一个控制台应用程序,起名为CodeFirstEF。我们简单一点,尽量不参杂到其它技术来进行演示,将学习难度降低到最低。
建立一个控制台应用程序没有什么好说的,这里想简单的提一下,使用EF有3种常用的模型,Database-First(数据库优先)、Model-First(模型优先)、Code-First(代码优先)。其中前两种,数据库优先和模型优先是比较简单的两种模型。可以直接通过VS工具连接数据库自动生成与数据库交互的DbContext对象,这种模式有点像我们老早用过的不写一行代码就能自动绑定GridView一样(虽然有点夸张),虽然极大的提高了使用效率,但是灵活度欠缺。因此这篇博客,主要演示代码优先模型,所以起名为CodeFirstEF。
第二步,在CodeFirstEF中建立一个文件夹Entity,里面放置两个模型实体(学生和课程):
namespace CodeFirstEF.Entity
{
public enum Gender { Female, Male }
public class Student
{
[Key]
[DatabaseGeneratedAttribute(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.Identity)]
public int StudentId { get; set; }
public string StudentName { get; set; }
public Gender Gender { get; set; }
public DateTime? BirthDay { get; set; }
public virtual ICollection<Subject> Subjects { get; set; }
}
}
学生类上面有个枚举,用以区别性别。
namespace CodeFirstEF.Entity
{
public class Subject
{
[Key]
[DatabaseGeneratedAttribute(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.Identity)]
public int SubjectId { get; set; }
public string SubjectName { get; set; }
public virtual ICollection<Student> Students { get; set; }
}
}
课程和学生类中都有两个虚属性,分别表示学生的课程以及课程有哪些学生。
第三步,添加EntityFramework支持。
两个Entity建好了,下面关键的要添加对EF的引用,这里介绍一个强大的工具NuGet程序包。我们右键点击控制台项目CodeFirstEF,选择管理NuGet程序包,打开下列弹出界面,选择联机,找到EntityFramework。
选择安装EntityFramework。
下载好EntityFramework会弹出窗口。
选择我接受,很快就会装好,装好后如下所示。
点击关闭。这时我们已经为我们的项目添加了EntityFramework支持,可以看到版本号为6,这是目前的最新版本。
第四步,在CodeFirstEF控制台项目下建立一个文件夹DAL,并创建一个数据库操作类DataContext。
namespace CodeFirstEF.DAL
{
public class DataContext : DbContext
{
public DataContext(string connectionName) : base(connectionName) { }
public DbSet<Student> Students { get; set; }
public DbSet<Subject> Subjects { get; set; }
}
}
它继承自DbContext,需要引用命名空间using System.Data.Entity。构造函数DbContext有一个参数connectionName,它是用于连接数据库的名称。这时我们切换到App.Config配置文件下,添加connectionStrings节点配置,将数据库连接的配置添加进去。
<?xml version="1.0" encoding="utf-8"?>
<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>
<connectionStrings>
<add name="codeFirstDb" connectionString="Data Source=.;uid=sa;pwd=123456;Database=CodeFirstDb;" providerName="System.Data.SqlClient"/>
</connectionStrings>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>
<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
<providers>
<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
</providers>
</entityFramework>
</configuration>
可以看到里面的codeFirstDb。
好了,这时候让我们看一下整个项目的结构。
第五步,在Program.cs的Main方法中写入测试代码。
namespace CodeFirstEF
{
class Program
{
static void Main(string[] args)
{
using (var db = new DataContext("codeFirstDb"))
{
//添加学生guwei4037
if (!db.Students.Any(x => x.StudentName == "guwei4037"))
{
db.Students.Add(new Student()
{
StudentName = "guwei4037",
Gender = Gender.Male,
BirthDay = new DateTime(1984, 11, 25),
});
}
//添加课程
if (!db.Subjects.Any(x => x.SubjectName == "English" || x.SubjectName == "Mathmatics" || x.SubjectName == "Computer"))
{
db.Subjects.AddRange(new Subject[]
{
new Subject()
{
SubjectName="English",
},
new Subject()
{
SubjectName="Mathmatics",
},
new Subject()
{
SubjectName="Computer",
}
});
}
//找到guwei4037这个学生
Student student = db.Students.FirstOrDefault(x => x.StudentName == "guwei4037");
//找到数学和英语这两门课程
List<Subject> subjects = db.Subjects.Where(x => x.SubjectName == "Mathmatics" || x.SubjectName == "English").ToList();
//给学生添加课程
foreach (Subject subject in subjects)
{
student.Subjects.Add(subject);
}
//让课程知道有哪些学生选择了它
foreach (Subject subject in subjects)
{
subject.Students.Add(student);
}
//删除guwei4037这个学生其中的数学这门课程
student.Subjects.Remove(db.Subjects.FirstOrDefault(x => x.SubjectName == "Mathmatics"));
//保存上述操作的结果
db.SaveChanges();
}
}
}
}
很简单,注释也很清晰。
运行一下整个控制台项目,没有报错说明程序运行成功了。我们进数据库查看一下运行的情况。
这里我们也可以利用VS工具来查看,无须打开SQL Server。
我们看到,EF替我们自动创建了数据库CodeFirstDb,并且为我们创建了一张中间表,而且将数据都插入到了相应表中。
怎么样,EF相当强大吧?而且非常简单好用,让你写代码有非常“爽”的感觉。真正的面向对象编程就是这么简单,不用再学习额外的SQL编程了。
分享到:
相关推荐
为了适应不同应用场景,Entity Framework Core提供了多个.NET实现的支持,并详细描述了不同的数据库提供程序(如Microsoft SQL Server、SQLite、内存优化表InMemory),以及如何编写自定义的数据库提供程序。...
Entity Framework 4.1 是微软开发的一个开源对象关系映射(ORM)框架,它为 .NET 开发者提供了强大的数据库访问能力。这个安装包解决了在 ADO.NET 框架下无法直接获取到 Entity Framework 4.1 的问题,使得开发者...
这个压缩包“entityFramework源代码”包含的是Entity Framework 6的源码,对于想要深入理解其工作原理和实现细节的开发者来说,这是一个宝贵的资源。 Entity Framework 6的主要特点包括: 1. **Code First**:这是...
EntityFramework.dll是微软开发的一个强大的对象关系映射(ORM)框架——Entity Framework的核心组件,主要用于.NET应用程序中。这个4.1版本的DLL文件是Entity Framework的早期版本,它为开发者提供了一个更简单的...
EntityFrameworkCore是一个强大的ORM(对象关系映射)框架,专为.NET Core和.NET Framework设计,由微软维护。它使得.NET开发者无需直接操作SQL语句,就能通过C#代码与数据库进行交互,极大地提高了开发效率。Entity...
EntityFramework.5.0.0.dll是微软开发的开源对象关系映射(ORM)框架Entity Framework的一个版本,主要用于简化.NET应用程序中的数据访问层操作。在这个版本中,它提供了丰富的功能和改进,帮助开发者更加高效地处理...
LINQ to SQL 和 Entity Framework 作为两种主流的对象关系映射(Object-Relational Mapping,简称 ORM)工具,在.NET 开发中占据着重要的地位。这两种技术虽然都属于 ORM 领域,但它们的设计理念和应用场景有所不同...
ADO.NET Entity Framework(简称EF)是微软推出的一种对象关系映射(ORM)框架,它允许开发者使用.NET语言(如C#或VB.NET)来操作数据库,而无需编写大量的SQL语句。这个“ado.net entity framework extension”指的...
EntityFramework.dll 是一个重要的组件,它是微软开发的Object-Relational Mapping (ORM)框架,用于简化.NET应用程序中的数据库操作。ORM允许开发者使用面向对象的编程方式来处理数据库,避免了直接编写SQL语句,...
**Entity Framework (EF)** 是由微软开发的一款对象关系映射(Object-Relational Mapping, ORM)框架,它使得 .NET 开发者能够更轻松地在应用程序中操作数据库数据,而无需编写大量的 SQL 代码。**Entity Framework ...
4. **关系映射**:EF自动处理复杂的数据关系,如一对一、一对多和多对多的关系。通过定义导航属性,可以在实体之间轻松导航和操作关联数据。 5. **性能优化**:理解延迟加载(Lazy Loading)和预加载(Eager ...
文件`EntityFramework.dll`是Entity Framework 4.3的核心库,包含了所有必要的类和方法,而`EntityFramework.xml`则是相关的XML文档,包含了库中类和方法的详细说明,有助于开发者进行API参考和调试。 总之,Entity...
实体框架 EntityFramework 使用概念层、映射层和逻辑层将逻辑数据库结构抽象化。 什么是 ADO.NET Entity Framework? ADO.NET Entity Framework 是一种实体框架,它提供了一种新的数据访问方式,允许开发人员使用...
Entity Framework(EF)是Microsoft开发的一个对象关系映射(ORM)框架,用于.NET应用程序。它允许开发者使用.NET语言(如C#或VB.NET)来操作数据库,而无需编写SQL语句,大大简化了数据访问层的开发工作。本教程...
在数据库领域,主从表是一个常见的概念,主表通常包含唯一的标识符,而从表通过这个标识符与主表建立关联,形成一对多的关系。本篇将详细介绍如何在Entity Framework中实现主从表的使用。 1. **创建模型类** 在...
### Entity Framework 教程知识点概览 #### 预备知识 预备知识部分涵盖了学习Entity Framework之前需要了解的一些基础知识,主要包括以下几点: 1. **LINQ技术**:这是.NET 3.5中引入的一项新技术,它扩展了.NET...
这个“一步一步学EntityFramework 源代码”的学习资源旨在帮助初学者深入理解EF的工作原理和实践应用。 在开始学习之前,我们需要了解ORM的基本概念。ORM是Object-Relational Mapping的缩写,它将数据库中的表映射...
Entity Framework(简称EF)是微软提供的一款对象关系映射(ORM)框架,它允许开发者使用.NET语言(如C#或VB.NET)来操作数据库,而无需编写大量的SQL语句。在EF中,实体数据模型(Entity Data Model)是核心概念,...