Entity Framework Code First模式基础知识及入门实例01
2016-08-10 17:34
573 查看
在深入学习某项技术之前,应该努力形成对此技术的总体印象,并了解其基本原理,本文的目的就在于此。
一、理解EF数据模型
EF本质上是一个ORM框架,它需要把对象映射到底层数据库中的表,为此,它使用了三个模型来描述这种映射关系。
(1)概念模型(Conceptual Model):主要体现为一组可以被应用程序直接使用的类。这些类也是我们在程序中直接使用的类,通常称之为“实体(Entity)”
(2)存储模型(Storage Model):主要体现为一组与底层数据存储介质(比如数据库系统)直接对应的类。
(3)概念-存储模型映射(Conceptual- Storage Mapping),解决“概念模型”中的类如何与“存储模型”中的类相互对应的问题。
(2)和(3)中的类型由EF内部使用,在实际开发中通常触及不到。所有这三种模型都集中放在名为edmx文件中,以XML方式表达。VisualStudio提供了一个向导,完成从现有数据库到EF数据模型间的映射转换工作。
EF是一种ORM工具,ORM表示对象关联映射。
在RDMS中,对象称为表格和列对象,而在.net中(面向对象)称为类,对象以及属性。任何数据驱动的应用实现的方式有两种:
1. 通过代码与数据库关联(称为数据访问层或数据逻辑层)
2. 通过编写代码将数据库数据映射到面向对象数据,或反向操作。
ORM是一种能够自动完成这两种方式的工具。EF是微软的ORM工具。
EF提供了三种方式来实现项目:
(1)数据库优先方法——创建数据库,包含表,列以及表之间的关系等,EF会根据数据库生成相应的Model类(业务实体)及数据访问层代码。
(2)模型优先方法——模型优先指模型类及模型之间的关系是由Model设计人员在VS中手动生成和设计的,EF将模型生成数据访问层和数据库。
(3)代码优先方法——代码优先指手动创建POCO类。这些类之间的关系使用代码定义。当应用程序首次执行时,EF将在数据库服务器中自动生成数据访问层以及相应的数据库。
实例演示:
1、新建一个控制台应用程序,名为EF Code First实例01
2、在解决方案名称上右键,选择“管理NuGet程序包”,选择“联机”,搜索Entity,如下图所示(如果是首次使用,则需要下载,以后则直接安装):
安装完成后,在引用中多了对EntityFramework和EntityFramework.SqlServer的引用,接着在程序中加入引用using System.Data.Entity;
3、修改App.config配置文件
其中,EFDemo为将要生成的数据库的名字
4、新建两个实体类,对应数据库中的两个表,一个为书Book.cs,另一个为书评BookReview.cs,为一对多的关系。
Book.cs:
打开SQL Server 2008,可以看到神奇的多了一个名为EFTest的数据库,和一个名为Book的表,一个名为BookReview的表,同样也可以看到两个表之间的外键参照关系。
一切就是这么的神奇!
7、现在我们给BookReview类中再添加一个属性Retime,如下:
很明显,因为你修改了实体类,数据库结构也需要修改,比较郁闷的是,你不能打开创建好的数据库直接修改,而需要使用一个名为“数据库迁移(Database Migration)”的功能,依次点击:工具→库程序包管理器→程序包管理器控制台,然后键入:enable-migrations –EnableAutomaticMigrations
上述命令会在项目中添加一个Migrations文件夹,其中会有一个Configuration类,为了方便,你需要在其构造函数中添加“AutomaticMigrationDataLossAllowed = true;”一句,让其自动重建数据库时不理会可能的数据丢。
好了,现在运行update-database命令更新数据库,一切OK!
再次运行程序,可以看到表BookReview中多了一个ReTime字段,类型为datetime。
一、理解EF数据模型
EF本质上是一个ORM框架,它需要把对象映射到底层数据库中的表,为此,它使用了三个模型来描述这种映射关系。
(1)概念模型(Conceptual Model):主要体现为一组可以被应用程序直接使用的类。这些类也是我们在程序中直接使用的类,通常称之为“实体(Entity)”
(2)存储模型(Storage Model):主要体现为一组与底层数据存储介质(比如数据库系统)直接对应的类。
(3)概念-存储模型映射(Conceptual- Storage Mapping),解决“概念模型”中的类如何与“存储模型”中的类相互对应的问题。
(2)和(3)中的类型由EF内部使用,在实际开发中通常触及不到。所有这三种模型都集中放在名为edmx文件中,以XML方式表达。VisualStudio提供了一个向导,完成从现有数据库到EF数据模型间的映射转换工作。
关系数据库的世界 | 数据库应用程序的世界 |
数据库 | DbContext类 |
表 | DbContext中的DbSet<实体类名> |
表间的关联 | 实体类之间的关联 |
表中的字段 | 实体类的公有属性 |
表中的单条记录 | 单个实体类的对象 |
视图 | DbContext中的DbSet<视图名称> |
存储过程 | DbContext中的公有方法 |
EF是一种ORM工具,ORM表示对象关联映射。
在RDMS中,对象称为表格和列对象,而在.net中(面向对象)称为类,对象以及属性。任何数据驱动的应用实现的方式有两种:
1. 通过代码与数据库关联(称为数据访问层或数据逻辑层)
2. 通过编写代码将数据库数据映射到面向对象数据,或反向操作。
ORM是一种能够自动完成这两种方式的工具。EF是微软的ORM工具。
EF提供了三种方式来实现项目:
(1)数据库优先方法——创建数据库,包含表,列以及表之间的关系等,EF会根据数据库生成相应的Model类(业务实体)及数据访问层代码。
(2)模型优先方法——模型优先指模型类及模型之间的关系是由Model设计人员在VS中手动生成和设计的,EF将模型生成数据访问层和数据库。
(3)代码优先方法——代码优先指手动创建POCO类。这些类之间的关系使用代码定义。当应用程序首次执行时,EF将在数据库服务器中自动生成数据访问层以及相应的数据库。
实例演示:
1、新建一个控制台应用程序,名为EF Code First实例01
2、在解决方案名称上右键,选择“管理NuGet程序包”,选择“联机”,搜索Entity,如下图所示(如果是首次使用,则需要下载,以后则直接安装):
安装完成后,在引用中多了对EntityFramework和EntityFramework.SqlServer的引用,接着在程序中加入引用using System.Data.Entity;
3、修改App.config配置文件
<?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="dblink" connectionString="Data Source=(local);Initial Catalog=EFTest;User ID=sa;Password=123456;" providerName="System.Data.SqlClient"/> </connectionStrings> <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> |
4、新建两个实体类,对应数据库中的两个表,一个为书Book.cs,另一个为书评BookReview.cs,为一对多的关系。
Book.cs:
using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace EF_Code_First_Test { public class Book { public virtual int Id { get; set; } public virtual string Name { get; set; } public virtual List<BookReview> Reviews { get; set; } } }BookReview.cs:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace EF_Code_First_Test { public class BookReview { public int Id { get; set; } public int BookId { get; set; } public string ReviewContent { get; set; } //public Book AssociationWithBook { get; set; } } }5、BookDb.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Data.Entity; namespace EF_Code_First_Test { public class BookDb:DbContext { public BookDb() : base("name=dblink") { } public DbSet<Book> Books { get; set; } public DbSet<BookReview> Reviews { get; set; } } }
Main()函数:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace EF_Code_First_Test { class Program { static void Main(string[] args) { using(var BookDB=new BookDb()) { bool res = BookDB.Database.CreateIfNotExists(); Book B1 = new Book() { Name="马丁的早晨" }; BookDB.Books.Add(B1); BookDB.SaveChanges(); BookReview Br = new BookReview() { BookId=2, ReviewContent="这本书是润田喜欢看的书,要我给他买。", ReTime=DateTime.Now }; BookDB.Reviews.Add(Br); BookDB.SaveChanges(); Console.WriteLine("共有{0}本书", BookDB.Books.Count()); foreach (var book in BookDB.Books.Select( b => new {bookid=b.Id, bookName = b.Name , reviewCount = b.Reviews.Count})) { Console.WriteLine("编码为{0}的{1}有评论{2}条。",book.bookid,book.bookName, book.reviewCount); } } } } }6、Ctrl+F5运行
打开SQL Server 2008,可以看到神奇的多了一个名为EFTest的数据库,和一个名为Book的表,一个名为BookReview的表,同样也可以看到两个表之间的外键参照关系。
一切就是这么的神奇!
7、现在我们给BookReview类中再添加一个属性Retime,如下:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace EF_Code_First_Test { public class BookReview { public int Id { get; set; } public int BookId { get; set; } public string ReviewContent { get; set; } //public Book AssociationWithBook { get; set; } public DateTime ReTime { get; set; } } }再次运行程序,提示一下错误信息:
很明显,因为你修改了实体类,数据库结构也需要修改,比较郁闷的是,你不能打开创建好的数据库直接修改,而需要使用一个名为“数据库迁移(Database Migration)”的功能,依次点击:工具→库程序包管理器→程序包管理器控制台,然后键入:enable-migrations –EnableAutomaticMigrations
上述命令会在项目中添加一个Migrations文件夹,其中会有一个Configuration类,为了方便,你需要在其构造函数中添加“AutomaticMigrationDataLossAllowed = true;”一句,让其自动重建数据库时不理会可能的数据丢。
好了,现在运行update-database命令更新数据库,一切OK!
再次运行程序,可以看到表BookReview中多了一个ReTime字段,类型为datetime。
相关文章推荐
- Entity Framework CodeFirst模式数据迁移
- Entity FrameWork Code First常用知识
- entity framework codefirst 用户代码未处理DataException,InnerException基础提供程序在open上失败,数据库生成失败
- 使用Entity Framework CodeFirst模式创建新数据库
- c#EntityFrameworkcodeFirst模式
- MVC入门 Model层设计+Code First EntityFrameWork(2)
- 使用Entity Framework CodeFirst模式创建新数据库
- Entity Framework Code First 实例
- Code First Entity Framework 6化被动为主动之explicit loading模式实战分析( 附源码)
- [ASP.NET MVC]Entity Framework框架之CodeFirst模式学习笔记
- Code First Entity Framework 6化被动为主动之explicit loading模式实战分析( 附源码)
- .Net Core 2.0 EntityFrameworkCore CodeFirst入门教程
- Code First Entity Framework 6化被动为主动之explicit loading模式实战分析( 附源码)
- Entity Framework Code First使用者的福音 --- EF Power Tool使用记之二(问题探究)
- 【译著】Code First :使用Entity. Framework编程(4)
- [Entity Framework书籍推荐]Programming Entity Framework 2nd Edition vs Code First Edition
- Code First + Entity. Framework 表关系
- Entity Framework Code First 提示 参数错误 hresult e_invalidarg
- 【译著】Code First :使用Entity. Framework编程(8)
- 【译著】Code First :使用Entity. Framework编程(3)