EF学习总结——CodeFirst

EF面向数据的一软件应用程序的技术,从名称来看,Entity Framework,实体框架,为什么说是面向数据呢?这里涉及到了EF的操作原理。它可以直接通过建立的实体来映射到数据库中的每张表,同时通过数据库中的表来映射实体中的各个属性。那么这里就涉及到三个对象,数据库,实体和code,所以,EF在构建映射关系时,也包含三种不同的构建方式,DataBaseFirst,ModelFirst和CodeFirst。

关于前两种的构建方式,均属于图形化界面方式,根据提示一步一步往下走,很容易完成,第三种codeFirst要求编写代码,通过代码来生成数据库,然后再通过数据库来生成Model。在完成这些工作之前,我们需要把各个实体之间的关系理清楚,同时涉及到主外键关联和导航属性的编写等。

这里以视频中的例子来理一下思路。顾客与订单之间的关系为一对多。

先来编写实体类:

在编写前,首先要添加EntityFramework组件,并引入命名空间using System.ComponentModel.DataAnnotations ;支持主外键的声明。

 public class Customer//顾客类
    {
       [Key]
        public int Id { get; set; }
        public string CusName { get; set; }
        public ICollection<OrderInfo> order { set; get; }//这里反应出顾客与订单之间的一对多关系
    }
public class OrderInfo //订单类
    {
        [Key]//指定主键
        public int Id { set; get; }
        public string Content { set; get; }
        public int customerId { set; get; }//外键
        public Customer customer { set; get; }//导航属性,多对一关系
    }

编写数据库上下文类:

using System.Data.Entity;

public class HotelDbContext:DbContext
    {
        public HotelDbContext ()
            :base("name=ConnCodeFirst") //这里要和配置文件中的名字一致
        { }
//数据库中包含以下两张表的集合
        public DbSet<Customer> Customer { set; get; }
        public DbSet<OrderInfo> OrderInfo { set; get; }
    }

执行客户端代码:

 static void Main(string[] args)
        {
            HotelDbContext dbcontext = new HotelDbContext();
            dbcontext.Database.CreateIfNotExists(); //创建一个数据库,如果不存在的话
        }

配置文件:

<configuration>
    <connectionStrings>
      <add name="ConnCodeFirst" connectionString ="server=.;uid=sa;pwd=123456;database=CodeFirstDb"
           providerName="System.Data.SqlClient"/>
      </connectionStrings>
</configuration>

通过以上步骤,就可以顺利创建一个数据库了,总的看来,EF中涉及到的就是这三种不同的构建方式,而在操作EF时,最终也离不开增删改查,而在EF中在对数据库进行操作时,说先要通过DbContext数据库上下文来对它进行操作,这里可以把它看成一个可供操作数据库的容器,在这个容器中对数据进行操作后,再将数据保存进数据库。

EF是在ADO.net基础上发展来的解决对象关系对应(ORM)的解决方案,ORM是一种思想,而EF是基于这种思想上的一种框架,它使得表和实体间具有映射关系。慢慢体会吧!

时间: 2024-10-25 22:34:45

EF学习总结——CodeFirst的相关文章

EF学习之CodeFirst(二)--数据迁移

使用CodeFirst时,如果Model发生改变的话,例如我们给User类里面新加个Sex属性,运行时会出现如下错误: 这时我们需要使用数据迁移来将model的改变同步更新到数据库中. 1.启用数据迁移功能 打开程序包管理控制台:选好要启动数据迁移的默认项目,输入enable-migrations,运行,出现下述情况即迁移成功. 启用数据迁移成功后项目里面会多出一个文件夹,文件夹里包括两个文件): 打开Configuration文件,将构造函数里面的AutomaticMigrationsEnab

EF学习之CodeFirst(一)--创建Model

一.创建Model 创建Model类有两种方式: 1.直接创建model 所有约束条件都以特性的方式写在model的属性上面,映射到数据库的table表名标识在class上,例如: [Table("UserInfo")] public class User { [Key]//主键 public int ID { get; set; } [MaxLength(50)]//最大长度 [Required]//不可为空 public string UserName { get; set; }

EF学习和使用综合

一.(引)你必须知道的EF知识和经验 二.(引)EF学习和使用(七)EF性能优化篇 三.(引)采用EntityFramework.Extended 对EF进行扩展(Entity Framework 延伸系列2)

EF学习笔记(九):异步处理和存储过程

总目录:ASP.NET MVC5 及 EF6 学习笔记 - (目录整理) 上一篇:EF学习笔记(八):更新关联数据 本篇原文:Async and Stored Procedures 为何要采用异步? 一个Web服务器肯定有可用线程的限制,那么在一些访问量特别大的情况下,线程肯定会消耗完:这个时候服务器肯定处理不了请求,必须等线程里处理结束才可以处理请求: 在非异步的时候,很多线程都处于等待状态,并不是一直在工作,而是在等类似于I/O等处理结束: 采用异步的时候,当一个处理在等待I/O处理结束的时

EF学习笔记(十一):实施继承

学习总目录:ASP.NET MVC5 及 EF6 学习笔记 - (目录整理) 上篇链接:EF学习笔记(十) 处理并发 本篇原文链接:Implementing Inheritance 面向对象的世界里,继承可以很好的重用代码.在本章就对Instructor和Student两个类进行实施继承处理,这两个类有公用的属性,比如LastName等,也有私有的属性: 可以不用增加任何页面,进行修改一些代码,这些修改后的继承关系就会自动反应到数据库中. 通过下图可以看到两个类有哪些公用属性: 那么就可以建一个

EF学习笔记(八):更新关联数据

学习笔记主目录链接:ASP.NET MVC5 及 EF6 学习笔记 - (目录整理) 上一篇链接:EF学习笔记(七):读取关联数据 本篇原文链接:Updating Related Data 本篇主要考虑对于有关联的数据进行新增.删除.更新操作:比如Course .Instructor: 对于Course来说,新增时候必须定义属于哪个Department,所以在新增.更新操作的时候,必须要用户选择Department: MVC5在选择基础控制器及视图框架的时候,如果选择EF的操作框架,则会自动带一

EF学习(一)

今天开始学习了EF的相关内容,以前只知道ADO.NET,今天学习后觉得有必要写个相关的学习心得,今天就先写第一篇. 我们的再学习的过程中所用到的环境是Windows7+SQLServer2008+VS2012. ①下面我们便开始创建一个数据库名为Test,数据库里建立两张表Student和Class. ②之后打开VS2012新建一个控制台应用程序名为Demo1.之后在Demo1这个项目上右击添加新建项,选择ADO.NET实体数据模型,并命名为DataModel.edmx. ③选择从数据库中生成,

asp.net EF学习系列----深入理解查询延迟加载技术

ado.net EF是微软的一个ORM框架,使用过EF的同学都知道EF有一个延迟加载的技术. 如果你是一个老鸟,你可能了解一些,如果下面的学习过程中哪些方面讲解的不对,欢迎批评指教.如果一个菜鸟,那我们就一起开始今天的学习. 首先,提出以下几个问题. 何为延迟加载呢? 我们该如何使用呢? 我们为什么要使用延迟加载技术呢? 延迟加载技术有什么优.缺点呢? 好,带着上面的问题我们开始今天的学习. 1.何为延迟加载 EF的延迟加载,就是使用Lambda表达式或者Linq 从 EF实体对象中查询数据时,

EF学习总结&mdash;开篇

学习EF之前要熟悉以下知识: 1.自动属性(Auto-Implemented Properties) //以前的写法 private string _userName; public string UserName { get { return _userName; } set { _userName= value; } } //现在 public string_userName {get;set;} 2.隐式类型var 它是在编译已经能确定变量的类型,是根据后面的值自动推断类型,编译时把推断的