前两回合,我们讨论学习了如何采用Entity Framework在没有数据库的情况下自己写一些实体类,然后通过CodeFirst反向生成对应的数据库。通过CodeFirst,我们摆脱了edmx文件,没有了繁琐的Xml关系映射,使代码变得无比的清晰,修改起来也变得更加容易。

在前两篇文章中,我们的数据库都是通过反向生成的,也就是说,属于一个New Database(新数据库),那么,对于一个Exist Database(已存在的数据库),我们又应该怎么办呢?本节文章,我们将对 Code First to an Existing Database 做出讨论学习。

本回合我们将讨论:

1、介绍使用“Entity Framework Power Tools“ 工具

2、EF CodeFirst to Existing Database 的快速入门

3、了解”Entity Framework Power Tools“ 工具为我们做了哪些事

案例代码可以点击这里下载


1、Entity Framework Power Tools 工具

在看完本节的导读时,也许你已经有了自己的一点想法:“按照我的数据库结构,自己手写出一些对应的实体Model,然后再写一个继承自DbContext的上下文……”。没错,恭喜你,你的想法理论上确实是可行的,至少在表不太多的情况下是可行的。但是,如果这个数据库的表有很多呢,数目已经达到了上百个或者更多呢?明显的,我们如果想自己手写实体和上下文,那无疑是一件巨大的工程。

既要懂得原理,也要懂得效率;我们要做某一件事,必须先要懂得它的原理,为什么要这么做,知其然知其所以然,所谓“原理先行”嘛。懂了了原理之后,我们需要提高效率,这在当今这个效率就是金钱的时代中尤为重要。

不扯开话题,下面我为大家介绍一款工具,它的名字就是:“Entity Framework Power Tools”,它的可以实现,对数据库中已存在的表自动的生成相应的实体和上下文。这款工具的下载地址各位读者可以点击这里获得最新版的下载。

各位读者下载下来之后,双击打开安装,然后再重启Visual Studio实例,就可以使用啦。

2、快速入门(快速案例)

我们新建一个解决方案                          

再看看我们的数据库,这里我采用上回合反向生成的数据库(由于VS自带的数据库管理器用起来速度太慢,我额外装了一个“SQL Server Management Studio”,数据库实例还是采用原先的轻量级数据库LocalDB,区别的仅仅是管理工具不同,数据库实例还是一样,各位读者不必感觉疑惑)

右键点击解决方案,我们发现了一些新东西

这就是我们刚才安装的EF工具,顺着点击进去,我们会弹出一个SQL Server的连接窗口,填写好相应的连接信息,点击确定

稍等一会儿,系统会自动的连接数据库,然后遍历所有的表,并根据表结构生成一些代码。

我们可以看到,解决方案中多了一个“Model”文件夹,里面包含有上下文、一些Model、“Mapping”文件夹以及其下的Map文件(映射文件)

我们先不解释里面的东西,先在Program中写调用代码,解释留到第三节再解析。

我们在Program中写如下调用代码:

class Program{static void Main(string[] args){using (var db = new CodeFirst_2013_3_23BlogContextContext()){Console.Write("Enter a name for a new blog:");var name = Console.ReadLine();var blog = new Blog { BlogName = name };db.Blogs.Add(blog);db.SaveChanges();var result = from b in db.Blogsselect b;foreach (var item in result){Console.WriteLine(item.BlogName);}}Console.ReadKey();}}

F5,调试:

可以正常执行(上面那个小蝶惊鸿是上回合CodeFirst操作中遗留下来的数据)

3、EF工具帮我们生成了什么

上一节我们是一个快速入门,这一节我们看看EF Tool帮我们生成了些什么代码。

先看一下App.config

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="CodeFirst_2013_3_23BlogContextContext" connectionString="Data Source=(localdb)\mydb;Initial Catalog=CodeFirst_2013_3_23.BlogContext;Integrated Security=True;MultipleActiveResultSets=True"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="v11.0" /></parameters></defaultConnectionFactory></entityFramework>
</configuration>

系统帮我们自动的填写配置信息,值得注意的是“connectionStrings”节点,这里配置了EF的连接字串,在初始化上下文的对象时,上下文的构造函数会默认的传入这里的连接字串。

<connectionStrings><add name="CodeFirst_2013_3_23BlogContextContext" connectionString="Data Source=(localdb)\mydb;Initial Catalog=CodeFirst_2013_3_23.BlogContext;Integrated Security=True;MultipleActiveResultSets=True"providerName="System.Data.SqlClient" /></connectionStrings>

进入“Model”文件夹

这里生成了一些实体类文件:

Post实体:

Post

    public partial class Post{public int PostID { get; set; }public string Title { get; set; }public string Content { get; set; }public int BlogID { get; set; }public virtual Blog Blog { get; set; }}

Blog实体:

Blog

public partial class Blog{public Blog(){this.Posts = new List<Post>();}public int BlogID { get; set; }public string BlogName { get; set; }public string Url { get; set; }public virtual ICollection<Post> Posts { get; set; }}

Type实体:

Type

public partial class Type{public int TypeID { get; set; }public string TypeName { get; set; }}

User实体:

User

public partial class User{public string UserName { get; set; }public string Display_Name { get; set; }}

还有上下文类CodeFirst_2013_3_23BlogContextContext:

CodeFirst_2013_3_23BlogContextContext

public partial class CodeFirst_2013_3_23BlogContextContext : DbContext{static CodeFirst_2013_3_23BlogContextContext(){Database.SetInitializer<CodeFirst_2013_3_23BlogContextContext>(null);}public CodeFirst_2013_3_23BlogContextContext(): base("Name=CodeFirst_2013_3_23BlogContextContext"){}public DbSet<Blog> Blogs { get; set; }public DbSet<Post> Posts { get; set; }public DbSet<Type> Types { get; set; }public DbSet<User> Users { get; set; }protected override void OnModelCreating(DbModelBuilder modelBuilder){modelBuilder.Configurations.Add(new BlogMap());modelBuilder.Configurations.Add(new PostMap());modelBuilder.Configurations.Add(new TypeMap());modelBuilder.Configurations.Add(new UserMap());}}

该上下文构造方法调用了父类DbContext的构造方法,传入配置文件中的数据库连接字串来连接需要的数据库。

(反编译DbContext得知其构造方法实际上是重载的方法,我们可以传入多种的参数形式,这里我们不做过多的介绍)

最后,我们进入“Mapping”文件夹

里面包含的都是实体与数据库,属性与字段映射的关系文件,作用跟使用edmx文件时,那繁琐的XML映射作用是一样的,不过,采用CodeFirst方式生成的关系映射,代码都是C#语言的,并且看起来相当清晰,以后重构起来也比edmx的XML方便得多。


至此,本回合的CodeFirst to Existing Database已经讨论讲解完毕,个人能力有限,可能文中会有错漏的地方,欢迎各位朋友指正以及提出建议。

转载于:https://www.cnblogs.com/xiaodiejinghong/archive/2013/03/25/2981232.html

初识Entity Framework CodeFirst(3)相关推荐

  1. 初识Entity Framework CodeFirst(2)

    上一回合,我们讨论了如何简单的使用Entity Framework CodeFirst功能. 结尾的时候,我们提出了一个有趣的问题,如果我们的数据实体需要发生变化呢?需要添加多一个Model类呢?修改 ...

  2. Entity Framework CodeFirst数据迁移

    原文:Entity Framework CodeFirst数据迁移 前言 紧接着前面一篇博文Entity Framework CodeFirst尝试. 我们知道无论是"Database Fi ...

  3. Entity Framework Codefirst的配置步骤

    Entity Framework Codefirst的配置步骤:  (1) 安装命令: install-package entityframework  (2) 创建实体类,注意virtual关键字在 ...

  4. MVC3学习第六章 排山倒海第二变----使用 Entity Framework Code-First 进行数据访问

    本章学习内容 1.Entity Framework 4.1介绍 2.Entity Framework Code-First 进行数据访问 3.利用EF实现用户的增加和列表功能 1.Entity Fra ...

  5. Entity Framework CodeFirst尝试

    前言 Code First模式我们称之为"代码优先"模式,是从EF4.1开始新建加入的功能.使用Code First模式进行EF开发时开发人员只需要编写对应的数据类(其实就是领域模 ...

  6. ASP.NET MVC5 Entity Framework CodeFirst(代码优先)

    第一步 打开VisualStudio2017 Ctrl+Shift+N新建项目 选择ASP.NET Web 应用程序 名称取名为BootstrapIntroduction第二步 项目模板选择MVC 第 ...

  7. Entity Framework CodeFirst For Oracle[转]

    说明:1)简单示例  2)非纯粹的CodeFirst,更多的是DbFirst+CodeFirst方式相结合.3)只需用Oracle最新版的ODAC,不需要第三方驱动.4)相应的web.config配置 ...

  8. Entity Framework:Code-First Tutorial开篇

    这个系列文章是关于Entity Framework Code-First的英文系列文章,内容不错,每篇一个主题知识点介绍,特转载过来 原文地址:http://www.entityframeworktu ...

  9. Code-First Migrations随Entity Framework 4.3一同发布

    Entity Framework 4.3 版本终于为开发者带来了迁移(Migrations)功能,从此以后使用EF不必依赖于单独预发布的迁移库了. 什么是EF迁移呢?如果你正在使用Entity Fra ...

最新文章

  1. 视频批量转换为FLV的软件开发总结(1)——思想总结篇
  2. 为 VUE 项目添加 PWA 解决发布后刷新报错问题
  3. 2017.0322.数字电路与系统-触发器
  4. 配置虚拟机Ubuntu网络连接
  5. 启明云端技术社区之星--张广星
  6. select、poll、epoll之间的区别(搜狗面试)
  7. 【学生信息管理系统】——优化篇(二)
  8. BookMarklet:瑞士军刀你用了吗?
  9. UPS开始尝试“货车+无人机”的投递方式,不必再担心快递员离职了
  10. 苹果保修期_iPhone 保修期内哪些情况可以获得免费维修?
  11. linux中删除文件命令
  12. 一步一个脚印学习WCF系列之WCF概要—生成元数据与代理(五)
  13. PYTHON之路(九)
  14. 计算机二级的理论知识点,计算机二级必备知识点
  15. LayUI表单验证select定位失效问题
  16. 昆仑通态复制的程序可以用吗_MCGS昆仑通态触摸屏常见问题(5)
  17. vue项目安装vuex报错:Object(...) is not a function“
  18. tplink路由器设置网址方法
  19. 计算机电源简单知识,基本知识:电脑电源工作流程以及电路图赏析
  20. matlab MinGW-w64 C/C++ Compiler 的配置(附百度云下载资源)

热门文章

  1. php 5.6 新特性,PHP 5.6正式发布:新特性、及功能改进介绍
  2. 阿里云性能测试服务 PTS 新面貌 - 压测协议、施压能力全新升级
  3. 云原生生态周报 Vol. 11 | K8s 1.16 早知道
  4. tftp的c语言实现,GitHub - ideawu/tftpx: TFTP server and client implementation in C
  5. 学java_如何一步一步的学Java
  6. iphone屏蔽系统更新_iPhone手机经常提示更新系统,教你一招关闭方法,学到了
  7. 网页连接不上java服务端,用Java插入IP时无法连接到服务器
  8. 在python中print表示的数据类型是_python之数据类型
  9. neo4j 机器学习_neo4j(图数据库)是什么?
  10. C++:迭代器(STL迭代器)iterator详解