开篇之前感谢 china_fucan的文章给我的帮助,下面的评论也解决了很多问题同样给予感谢.

code first

项目中的ORM框架如果采用的是EF,那么可能会采用code first的方式去使用EF.就是先将数据库的实体类,以及EF的核心DBContext写好之后, 运行程序会通过特定的数据库链接字符串在数据库中生成相应的table或数据.

创建一个code first demo

  • 使用vs新建一个console app
  • 创建一个class命名为Ef6RecipesContext,并且继承自DbContext.
  1. using System.Data.Entity;
  2. using DennisEFDemo.CodeFirstDemo.DBModels;
  3. namespace DennisEFDemo.CodeFirstDemo.DBContext
  4. {
  5. public class Ef6RecipesContext : DbContext
  6. {
  7. public DbSet<PictureCategory> PictureCategories { get; set; }
  8. public Ef6RecipesContext()
  9. : base("name=EF6CodeFirstRecipesContext")
  10. {
  11. }
  12. /// <summary>
  13. /// 在EF6RecipesContext中重写方法OnModelCreating配置双向关联(ParentCategory 和 SubCategories)
  14. /// </summary>
  15. /// <param name="modelBuilder"></param>
  16. protected override void OnModelCreating(DbModelBuilder modelBuilder)
  17. {
  18. base.OnModelCreating(modelBuilder);
  19. modelBuilder.Entity<PictureCategory>().HasMany(t => t.Subcategories).WithOptional(t => t.ParentCategory);
  20. }
  21. }
  22. }
  • 创建DB models PictureCategory
  1. using System.Collections.Generic;
  2. using System.ComponentModel.DataAnnotations;
  3. using System.ComponentModel.DataAnnotations.Schema;
  4. namespace DennisEFDemo.CodeFirstDemo.DBModels
  5. {
  6. [Table("PictureCategory", Schema = "dbo")]
  7. public class PictureCategory
  8. {
  9. [Key]
  10. [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
  11. public int CategoryId { get; private set; }
  12. public string Name { get; set; }
  13. public int? ParentCategoryId { get; private set; }
  14. [ForeignKey("ParentCategoryId")]
  15. public virtual PictureCategory ParentCategory { get; set; } //书中没有virtual关键字,这会导致导航属性不能加载,后面的输出就只有根目录!!
  16. public virtual List<PictureCategory> Subcategories { get; set; }
  17. public PictureCategory()
  18. {
  19. Subcategories = new List<PictureCategory>();
  20. }
  21. }
  22. }
  • 在main函数中写一个静态方法
  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. RunExample();
  6. Console.ReadKey();
  7. }
  8. static void RunExample()
  9. {
  10. using (var context = new Ef6RecipesContext())
  11. {
  12. var louvre = new PictureCategory { Name = "Louvre" };
  13. var child = new PictureCategory { Name = "Egyptian ANTIQUITéS" };
  14. louvre.Subcategories.Add(child);
  15. child = new PictureCategory { Name = "Sculptures" };
  16. louvre.Subcategories.Add(child);
  17. child = new PictureCategory { Name = "Paintings" };
  18. louvre.Subcategories.Add(child);
  19. var paris = new PictureCategory { Name = "Paris" };
  20. paris.Subcategories.Add(louvre);
  21. var vacation = new PictureCategory { Name = "Summer Vacation" };
  22. vacation.Subcategories.Add(paris);
  23. context.PictureCategories.Add(paris);
  24. context.SaveChanges();
  25. }
  26. using (var context = new Ef6RecipesContext())
  27. {
  28. var roots = context.PictureCategories.Where(c => c.ParentCategory == null);
  29. roots.ToList().ForEach(root => Print(root, 0));
  30. }
  31. }
  32. static void Print(PictureCategory cat, int level)
  33. {
  34. StringBuilder sb = new StringBuilder();
  35. Console.WriteLine("{0}{1}", sb.Append(' ', level).ToString(), cat.Name);
  36. cat.Subcategories.ForEach(child => Print(child, level + 1));
  37. }
  38. }
  • 修改app.config文件(如果是web工程则为web.config)
  1. <connectionStrings>
  2. <add name="EF6CodeFirstRecipesContext" connectionString="Data Source=stcav-235\stcav235;initial catalog=EF6Recipes;user id=sa;password=`*******`;" providerName="System.Data.SqlClient" />
  3. </connectionStrings>
  • 运行程序,会在数据库中创建相应的table并将数据写入后读取输出到控制台.

  • 源代码我会上传到git上,链接.

DBModelBuilder

上述代码中的Ef6RecipesContext类中有个DBModelBuilder,我查了一下文档, 一般使用这个类的EF项目基本上都是CODE FIRST approach.解释一下这玩意:

DbModelBuilder用于将CLR类映射到数据库模型.

这种以代码为中心的构建实体数据模型(EDM)模型的方法称为“代码优先(code first)”

DbModelBuilder通常用于通过重写DbContext.OnModelCreating(DbModelBuilder)来配置模型

还可以独立于DbContext使用DbModelBuilder来构建模型

但是,推荐的方法是在DbContext中使用OnModelCreating, 优点是工作流程更直观,可以处理常见任务,例如缓存创建的模型。形成模型的类型在DbModelBuilder中注册,可选配置,可以通过将数据注释应用于您的类和使用流畅的样式DbModelBuilder来执行API。

目前先写到这儿,上述内容有误还请点击下方图标联系我, 如有新内容会继续对此文进行更新,有兴趣的话可以保持关注.

【Entity framework】Code First Approach的更多相关文章

  1. 【Entity Framework】Model First Approach

    EF中的model first 所谓mf, 就是使用vs提供的edm designer去设计model,然后将设计好的model使用vs在指定的数据库中生成数据库即可. 当你的项目既没有数据库也没有c ...

  2. 【Entity Framework】 Entity Framework资料汇总

    Fluent API : http://social.msdn.microsoft.com/Search/zh-CN?query=Fluent%20API&Refinement=95& ...

  3. 【Entity Framework】Revert the database to specified migration.

    本文涉及的相关问题,如果你的问题或需求有与下面所述相似之处,请阅读本文 [Entity Framework] Revert the database to specified migration. [ ...

  4. 【Entity Framework】disable automatic migration, 执行update-migration仍然会显示有automatic migration

    本文涉及的相关问题,如果你的问题或需求有与下面所述相似之处,请阅读本文 [Entity Framework] disable automatic migration, 执行update-migrati ...

  5. 【Entity Framework】初级篇--ObjectContext、ObjectQuery、ObjectStateEntry、ObjectStateManager类的介绍

    本节,简单的介绍EF中的ObjectContext.ObjectQuery.ObjectStateEntry.ObjectStateManager这个几个比较重要的类,它们都位于System.Data ...

  6. 【极力分享】[C#/.NET]Entity Framework(EF) Code First 多对多关系的实体增,删,改,查操作全程详细示例【转载自https://segmentfault.com/a/1190000004152660】

      [C#/.NET]Entity Framework(EF) Code First 多对多关系的实体增,删,改,查操作全程详细示例 本文我们来学习一下在Entity Framework中使用Cont ...

  7. AppBox升级进行时 - 拥抱Entity Framework的Code First开发模式

    AppBox 是基于 FineUI 的通用权限管理框架,包括用户管理.职称管理.部门管理.角色管理.角色权限管理等模块. 从Subsonic到Entity Framework Subsonic最早发布 ...

  8. Entity Framework 6 Code First新特性:支持存储过程

    Entity Framework 6提供支持存储过程的新特性,本文具体演示Entity Framework 6 Code First的存储过程操作. Code First的插入/修改/删除存储过程 默 ...

  9. 创建ASP.NET Core MVC应用程序(3)-基于Entity Framework Core(Code First)创建MySQL数据库表

    创建ASP.NET Core MVC应用程序(3)-基于Entity Framework Core(Code First)创建MySQL数据库表 创建数据模型类(POCO类) 在Models文件夹下添 ...

随机推荐

  1. uvalive 4960 Sensor Network

    题意: 给出一个无向图,求一个生成树使得这个生成树的最大边与最小边之差最小,输出这个最小的差值.n的最大值为350. 思路: 这题不看题解想破头也不知道怎么写Orz. 暴力的做法是可以从大到小枚举边作 ...

  2. 导航,头部,CSS基础

    1.制作自己的导航条. 2.HTML头部元素: <base>  定义了页面链接标签的默认链接地址 <style>  定义了HTML文档的样式文件 <link>  定 ...

  3. QT 通过QNetworkReply *获取对应请求的URL地址

    [1]QT 通过QNetworkReply *获取对应请求的URL地址 reply->url().toString(); Good Good Study, Day Day Up. 顺序 选择 循 ...

  4. Eclipse中tomcat更改部署路径 deply path

    默认是部署在项目元数据文件夹.metadata文件夹下,需要更改到tomcat/webapps目录下 Eclipse中tomcat service设置 选择window ----show view-- ...

  5. golang学习笔记10 beego api 用jwt验证auth2 token 获取解码信息

    golang学习笔记10 beego api 用jwt验证auth2 token 获取解码信息 Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放 ...

  6. MVC 部署HTTPS网站

    一.项目配置 什么是全站HTTPS 全站HTTPS就是指整个网站的所有页面,所有资源全部使用HTTPS链接.当用户的某个请求是明文的HTTP时,应该通过HTTP状态码301永久重定向到对应的HTTPS ...

  7. POSIX rename语义

    POSIX对rename行为的定义如下(http://www.opengroup.org/onlinepubs/009695399/functions/rename.html): 将一个文件重命名为一 ...

  8. Django后端项目---- Rest Framework(2)

    一.认证(补充的一个点) 认证请求头 #!/usr/bin/env python # -*- coding:utf-8 -*- from rest_framework.views import API ...

  9. Java 线程类的一些常用方法

    线程类的一些常用方法: sleep(): 强迫一个线程睡眠N毫秒.  isAlive(): 判断一个线程是否存活.  join(): 等待线程终止.  activeCount(): 程序中活跃的线程数 ...

  10. JVM 一套卷,助你快速掌握优化法则

    一:虚拟机内存图解 JAVA 程序运行与虚拟机之上,运行时需要内存空间.虚拟机执行 JAVA 程序的过程中会把它管理的内存划分为不同的数据区域方便管理. 虚拟机管理内存数据区域划分如下图: 数据区域分 ...