新建类库Models,加入以下三个类:

Product:

  1. public class Product
  2. {
  3. /// <summary>
  4. /// 编号
  5. /// </summary>
  6. public int Id { get; set; }
  7. /// <summary>
  8. /// 名称
  9. /// </summary>
  10. public string Name { get; set; }
  11. /// <summary>
  12. /// 型号
  13. /// </summary>
  14. public string Code { get; set; }
  15. /// <summary>
  16. /// 单价
  17. /// </summary>
  18. public double Price { get; set; }
  19. /// <summary>
  20. /// 单位
  21. /// </summary>
  22. public string Unit { get; set; }
  23. /// <summary>
  24. /// 数量
  25. /// </summary>
  26. public double Count { get; set; }
  27. /// <summary>
  28. /// 最后更新时间
  29. /// </summary>
  30. public DateTime LastUpdateTime { get; set; }
  31. }

Purchase:

  1. public class Purchase
  2. {
  3. /// <summary>
  4. /// 编号
  5. /// </summary>
  6. public int Id { get; set; }
  7. /// <summary>
  8. /// 产品编号
  9. /// </summary>
  10. public int ProductId { get; set; }
  11. /// <summary>
  12. /// 单价
  13. /// </summary>
  14. public double Price { get; set; }
  15. /// <summary>
  16. /// 数量
  17. /// </summary>
  18. public double Count { get; set; }
  19. /// <summary>
  20. /// 总价
  21. /// </summary>
  22. public double TotalPrice { get; set; }
  23. /// <summary>
  24. /// 实际总价
  25. /// </summary>
  26. public double ActualPrice { get; set; }
  27. /// <summary>
  28. /// 创建时间
  29. /// </summary>
  30. public DateTime CreateTime { get; set; }
  31. public virtual Product Product { get; set; }
  32. }

Sale:

  1. public class Sale
  2. {
  3. /// <summary>
  4. /// 编号
  5. /// </summary>
  6. public int Id { get; set; }
  7. /// <summary>
  8. /// 产品编号
  9. /// </summary>
  10. public int ProductId { get; set; }
  11. /// <summary>
  12. /// 单价
  13. /// </summary>
  14. public double Price { get; set; }
  15. /// <summary>
  16. /// 数量
  17. /// </summary>
  18. public double Count { get; set; }
  19. /// <summary>
  20. /// 总价
  21. /// </summary>
  22. public double TotalPrice { get; set; }
  23. /// <summary>
  24. /// 实际总价
  25. /// </summary>
  26. public double ActualPrice { get; set; }
  27. /// <summary>
  28. /// 创建时间
  29. /// </summary>
  30. public DateTime CreateTime { get; set; }
  31. public virtual Product Product { get; set; }
  32. }

通过nuget引入EF:

  1. install-package entityframework

在单元测试或者应用程序中也引入EF,在App.config或Web.config中会自动加入EF的配置:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <configuration>
  3. <configSections>
  4. <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
  5. <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  6. </configSections>
  7. <connectionStrings>
  8. <add name="SalesDB" connectionString="server=.;database=SalesDB;uid=sa;pwd=pwd;" providerName="System.Data.SqlClient"/>
  9. </connectionStrings>
  10. <entityFramework>
  11. <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
  12. <parameters>
  13. <parameter value="mssqllocaldb" />
  14. </parameters>
  15. </defaultConnectionFactory>
  16. <providers>
  17. <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
  18. </providers>
  19. </entityFramework>
  20. </configuration>

在connectionStrings节点中添加数据库连接

新建DBContext类:

  1. public class SalesContext : DbContext
  2. {
  3. public SalesContext() : base("name=SalesDB")
  4. {
  5. Database.SetInitializer(new MigrateDatabaseToLatestVersion<SalesContext, Models.Migrations.Configuration>("SalesDB"));
  6. }
  7. public DbSet<Product> Products { get; set; }
  8. public DbSet<Purchase> Purchases { get; set; }
  9. public DbSet<Sale> Sales { get; set; }
  10. protected override void OnModelCreating(DbModelBuilder modelBuilder)
  11. {
  12. base.OnModelCreating(modelBuilder);
  13. }
  14. }

"name=SalesDB"表示使用config中配置的连接

  1. Database.SetInitializer(new MigrateDatabaseToLatestVersion<SalesContext, Models.Migrations.Configuration>("SalesDB"));

开启自动迁移到最新版本,这样不会删除原有表和数据

在程序包管理控制台中输入:enable-migrations –EnableAutomaticMigration:$true,即可开启自动迁移。

当然也可以手动迁移,需要用到下面命令:

enable-migrations

会在Models中的Migrations目录中自动生成201603290414524_InitialCreate.cs

Add-migration

add-migration PurchaseChange   需要输入迁移的名称

会在Models中的Migrations目录中自动生成201603300705373_PurchaseChange.cs

Update-database

update-database –verbose可以看到迁移的代码

这里需要注意的是如果数据库中已有相同的表,再开启自动迁移的话会提示错误,这是只需把InitialCreate.cs删除再update-database即可

如果属性名为 Id 或 <类名>Id. Code-First 会自动以此创建主键.主键可以是任意类型, 如果主键是数字型或者GUID,会配置成自动增长或自动生成.

但如果像下面这样定义类的话就会报错:

  1. public class Product
  2. {public int PId { get; set; }
  3. public string Name { get; set; }
  4. }

在Purchases类中,定义了Product的关联,

  1. public int ProductId { get; set; }
  2. public virtual Product Product { get; set; }

EF会自动为在Purchases中创建ProductId 外键:

在迁移代码中可以看到:

  1. public partial class PurchaseChange : DbMigration
  2. {
  3. public override void Up()
  4. {
  5. CreateIndex("dbo.Purchases", "ProductId");
  6. AddForeignKey("dbo.Purchases", "ProductId", "dbo.Products", "Id", cascadeDelete: true);
  7. }
  8.  
  9. public override void Down()
  10. {
  11. DropForeignKey("dbo.Purchases", "ProductId", "dbo.Products");
  12. DropIndex("dbo.Purchases", new[] { "ProductId" });
  13. }
  14. }

Sales类也添加了ProductId的外键,这样在创建Sale时如果新增Product的话,会自动把新增Product的Id赋值到Sale里的ProductId上:

  1. using (var ctx = new SalesContext())
  2. {
  3. Product p1 = , Count = , Unit = "g", LastUpdateTime = DateTime.Now };
  4. ctx.Products.Add(p1);
  5.  
  6. Sale s1 = , Count = , TotalPrice = , ActualPrice = , CreateTime = DateTime.Now,Product=p1 };
  7. ctx.Sales.Add(s1);
  8. ctx.SaveChanges();
  9. }

怎么进行多表查询呢?

  1. public class Student
  2. {
  3. public Student()
  4. {
  5.  
  6. }
  7. public int StudentID { get; set; }
  8. public string StudentName { get; set; }
  9. public DateTime? DateOfBirth { get; set; }
  10. public byte[] Photo { get; set; }
  11. public decimal Height { get; set; }
  12. public float Weight { get; set; }
  13. public int TeacherId { get; set; }
  14. public int StandardId { get; set; }
  15. }
  1. public class Teacher
  2. {
  3. public Teacher()
  4. {
  5.  
  6. }
  7. public int TeacherId { get; set; }
  8. public string TeacherName { get; set; }
  9. }
  1. public class Standard
  2. {
  3. public Standard()
  4. {
  5.  
  6. }
  7. public int StandardId { get; set; }
  8. public string StandardName { get; set; }
  9. }

这里没有定义表的外键,要查询的时候可以如下查询:

  1. public class StudentViewModel
  2. {
  3. public int StudentID { get; set; }
  4. public string StudentName { get; set; }
  5.  
  6. public string StandardName { get; set; }
  7. public string TeacherName { get; set; }
  8. }
  1. var stu = from u in ctx.Students
  2. join da in ctx.Standards on u.StandardId equals da.StandardId
  3. join ta in ctx.Teachers on u.TeacherId equals ta.TeacherId
  4. select new StudentViewModel()
  5. {
  6. StudentID = u.StudentID,
  7. StudentName = u.StudentName,
  8. StandardName = da.StandardName,
  9. TeacherName = ta.TeacherName
  10. };
  11. var stuview = stu.FirstOrDefault();

EF CodeFirst Mirgration的更多相关文章

  1. 1.【使用EF Code-First方式和Fluent API来探讨EF中的关系】

    原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/relationship-in-entity-framework-using-code-firs ...

  2. [.NET领域驱动设计实战系列]专题一:前期准备之EF CodeFirst

    一.前言 从去年已经接触领域驱动设计(Domain-Driven Design)了,当时就想自己搭建一个DDD框架,所以当时看了很多DDD方面的书,例如领域驱动模式与实战,领域驱动设计:软件核心复杂性 ...

  3. [转]Using Entity Framework (EF) Code-First Migrations in nopCommerce for Fast Customizations

    本文转自:https://www.pronopcommerce.com/using-entity-framework-ef-code-first-migrations-in-nopcommerce-f ...

  4. EF CodeFirst 如何通过配置自动创建数据库<当模型改变时>

    最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来. 十年河东十年河西,莫欺少年穷 学无止境,精益求精    本篇为进阶篇,也是弥补自己之前没搞明白的地方,惭愧 ...

  5. EF CodeFirst增删改查之‘CRUD’

    最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来. 十年河东十年河西,莫欺少年穷 学无止境,精益求精    本篇旨在学习EF增删改查四大操作 上一节讲述了EF ...

  6. EF CodeFirst 创建数据库

    最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来. 十年河东十年河西,莫欺少年穷 学无止境,精益求精    话说EF支持三种模式:Code First   M ...

  7. 新年奉献MVC+EF(CodeFirst)+Easyui医药MIS系统

    本人闲来无事就把以前用Asp.net做过的一个医药管理信息系统用mvc,ef ,easyui重新做了一下,业务逻辑简化了许多,旨在加深对mvc,ef(codefirst),easyui,AutoMap ...

  8. EF Codefirst 初步学习(二)—— 程序管理命令 更新数据库

    前提:搭建成功codefirst相关代码,参见EF Codefirst  初步学习(一)--设置codefirst开发模式 具体需要注意点如下: 1.确保实体类库程序生成成功 2.确保实体表类库不缺少 ...

  9. EF CodeFirst系列(3)---EF中的继承策略(暂存)

    我们初始化数据库一节已经知道:EF为每一个具体的类生成了数据库的表.现在有了一个问题:我们在设计领域类时经常用到继承,这能让我们的代码更简洁且容易管理,在面向对象中有“has  a”和“is a”关系 ...

随机推荐

  1. Spring 、 CXF 整合 swagger 【试炼】

    官网:http://swagger.io/ http://swagger.io/specification/ 上面就是描述了什么是 SWAGGER OBJECT 2. 如何用jax-rs 注解方式产生 ...

  2. iOS的block内存管理

    初始情况下: block本身.__block修饰的变量以及在block内部使用的变量都是在栈里的. __block修饰的变量的地址会作为实参传入block块内部(暂时先这么理解,实际比较复杂).blo ...

  3. PAT 甲 1005. Spell It Right (20) 2016-09-09 22:53 42人阅读 评论(0) 收藏

    1005. Spell It Right (20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Given ...

  4. 几个经典的数学库之一学习---VCGlib(1)

    1. VCG Libary是Visulization and Computer Graphics Libary(可视化与计算机图形学库)的缩写,是一个开源的C++模板库,用于三角网格和四面体网格的控制 ...

  5. hdu 5023 线段树+状压

    http://acm.hdu.edu.cn/showproblem.php?pid=5023 在片段上着色,有两种操作,如下: 第一种:P a b c 把 a 片段至 b 片段的颜色都变为 c . 第 ...

  6. java web eclipse中项目的加载过程

    java web eclipse中项目的加载过程: Tomcat默认从WEB-INF/目录下加载资源,Eclipse在发布程序的时候,并没有把User Libraries的相关资源拷贝到WEB-INF ...

  7. 百分之 95% 的程序员不知道 Trending 是什么。

    前言如果学习到的知识不成体系,那么遇到问题时就会非常难解决.常有人问你从哪里了解新技术怎么判断其发展趋势的,除了关注 Hacker News 以及庞大的 Awesome 还有没有其它方式?有啊当然是每 ...

  8. Spring Boot 2 实践记录之 Redis 及 Session Redis 配置

    先说 Redis 的配置,在一些网上资料中,Spring Boot 的 Redis 除了添加依赖外,还要使用 XML 或 Java 配置文件做些配置,不过经过实践并不需要. 先在 pom 文件中添加 ...

  9. ASP.NET MVC URL重写与优化(初级篇)-使用Global路由表定制URL

    ASP.NET MVC URL重写与优化(初级篇)-使用Global路由表定制URL 引言--- 在现今搜索引擎制霸天下的时代,我们不得不做一些东西来讨好爬虫,进而提示网站的排名来博得一个看得过去的流 ...

  10. Prism 的 TabControl 导航

    基于Prism 7.1 最近工作中可能会用到TabControl所以作为小菜的我提前预习了一下,结果并没有我想的那么简单,于是乎 各种网上查,本来用wpf的人就不多 prism 的可查的资料就更少的可 ...