3.EF6

3.1初步目录及说明

下面是用VS2013开发环境创建的项目:

说明:控制台项目类型,安装 EF版本为6.1.3 , 数据库连接字符串配置:

  1. 隐藏代码 <connectionStrings>
  2. <add name="DefaultConnection"
  3. connectionString="Data Source=.;Initial Catalog=TestDB;UID=sa;PWD=123456"
  4. providerName="System.Data.SqlClient" />
  5. </connectionStrings>

EFContext.cs代码:

  1. 隐藏代码using Consoles.EF6.Models;
  2. using System.Data.Entity;
  3. namespace Consoles.EF6.Repositories
  4. {
  5. public class EFContext : DbContext
  6. {
  7. public EFContext() : base("DefaultConnection") { }
  8. public DbSet<Category> Categories { get; set; }
  9. protected override void OnModelCreating(DbModelBuilder modelBuilder)
  10. {
  11. modelBuilder.Entity<Category>().HasKey(k => k.CategoryId) //设置主键
  12. .Property(q => q.CategoryName).IsRequired();//设置不能为空
  13. }
  14. }
  15. }

注:

a.数据库上下文 构造方法 ,继承基类,其参数是DefaultConnection,配置的数据库连接字符串中name值 要一致 ;

如果name值和上下文类名(EFContext)一致的话,上下文类的构造方法也 可以省略 .

b.为了保持实体类" 干净 ",不使用 DataAnnotations 数据注解特性,改为 Fluent API 配置方式.当然有些已经默认了,我们照样进行配置.

如:属性为 Id(字母不分大小写)或为类名+Id ,它会默认为主键,但我们也配置:Entity<Category>().HasKey(k => k.CategoryId)

疑问 :这种两种方式,到底采用那种好呢?这个……我表示无语,你自个看那个爽啦。

3.2示例一

Category.cs代码:

  1. 隐藏代码namespace Consoles.EF6.Models
  2. {
  3. public class Category
  4. {
  5. public int CategoryId { get; set; }
  6. public string CategoryName { get; set; }
  7. public string Description { get; set; }
  8. }
  9. }

Program.cs代码:

  1. 隐藏代码using Consoles.EF6.Models;
  2. using Consoles.EF6.Repositories;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Linq;
  6. using System.Data.Entity.Migrations;
  7. namespace Consoles.EF6
  8. {
  9. class Program
  10. {
  11. static void Main(string[] args)
  12. {
  13. #region 示例一
  14. using (var db = new EFContext())
  15. {
  16. var categories = new List<Category>
  17. {
  18. new Category(){ CategoryName="Mobile",Description="手机大类"},
  19. new Category(){ CategoryName="Computer",Description="电脑大类"}
  20. };
  21. //AddOrUpdate:根据指定列,相同就更新,不相同就添加
  22. categories.ForEach(list => db.Categories.AddOrUpdate(c => c.CategoryId, list));
  23. db.SaveChanges();
  24. //var query = db.Categories;
  25. var query = from c in db.Categories select c;
  26. //遍历输出
  27. foreach (var item in query)
  28. {
  29. Console.WriteLine("类别:{0};说明:{1}", item.CategoryName, item.Description);
  30. }
  31. }
  32. #endregion
  33. Console.ReadKey();
  34. }
  35. }
  36. }

运行结果: 

查看数据库:

3.3示例二

我们添一个 Subcategory.cs ,其代码:

  1. 隐藏代码namespace Consoles.EF6.Models
  2. {
  3. public class Subcategory
  4. {
  5. public int SubcategoryId { get; set; }
  6. public string SubcategoryName { get; set; }
  7. public int CategoryId { get; set; }
  8. public Category Category { get; set; }
  9. }
  10. }

再修改 Category.cs 代码:

  1. 隐藏代码using System.Collections.Generic;
  2. namespace Consoles.EF6.Models
  3. {
  4. public class Category
  5. {
  6. public int CategoryId { get; set; }
  7. public string CategoryName { get; set; }
  8. public string Description { get; set; }
  9. public ICollection<Subcategory> Subcategories { get; set; }
  10. }
  11. }

设计关系 为:大类Category:子类Subcategory=1:N。子类必须属于某一个大类,也就是外键不能为空。配置 Fluent API

  1. 隐藏代码using Consoles.EF6.Models;
  2. using System.Data.Entity;
  3. namespace Consoles.EF6.Repositories
  4. {
  5. public class EFContext : DbContext
  6. {
  7. public EFContext() : base("DefaultConnection") { }
  8. public DbSet<Category> Categories { get; set; }
  9. public DbSet<Subcategory> Subcategories { get; set; }
  10. protected override void OnModelCreating(DbModelBuilder modelBuilder)
  11. {
  12. modelBuilder.Entity<Category>().HasMany(s => s.Subcategories)
  13. .WithRequired(c => c.Category).HasForeignKey(f=>f.CategoryId);
  14. modelBuilder.Entity<Category>().HasKey(k => k.CategoryId);
  15. modelBuilder.Entity<Category>().Property(p => p.CategoryName).HasMaxLength(20);
  16. modelBuilder.Entity<Subcategory>().HasKey(K => K.SubcategoryId);
  17. modelBuilder.Entity<Subcategory>().Property(p => p.SubcategoryName).IsRequired();
  18. }
  19. }
  20. }

Program.cs代码:

  1. 隐藏代码using Consoles.EF6.Models;
  2. using Consoles.EF6.Repositories;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Linq;
  6. using System.Data.Entity.Migrations;
  7. namespace Consoles.EF6
  8. {
  9. class Program
  10. {
  11. static void Main(string[] args)
  12. {
  13. #region 示例二
  14. using (var db = new EFContext())
  15. {
  16. var categories = new List<Category>
  17. {
  18. new Category(){ CategoryName="Mobile",Description="手机大类"},
  19. new Category(){ CategoryName="Computer",Description="电脑大类"}
  20. };
  21. categories.ForEach(list => db.Categories.AddOrUpdate(c => c.CategoryId, list));
  22. db.SaveChanges();
  23. var subcategories = new List<Subcategory>
  24. {
  25. new Subcategory(){ SubcategoryName="2G",Category=db.Categories.Single(c=>c.CategoryName=="Mobile")},
  26. new Subcategory(){ SubcategoryName="3G",Category=db.Categories.Single(c=>c.CategoryName=="Mobile")},
  27. new Subcategory(){ SubcategoryName="4G",Category=db.Categories.Single(c=>c.CategoryName=="Mobile")},
  28. new Subcategory(){ SubcategoryName="Desktop",Category=db.Categories.Single(c=>c.CategoryName=="Computer")},
  29. new Subcategory(){ SubcategoryName="Tablet ",Category=db.Categories.Single(c=>c.CategoryName=="Computer")}
  30. };
  31. subcategories.ForEach(list => db.Subcategories.AddOrUpdate(c => c.SubcategoryId, list));
  32. db.SaveChanges();
  33. var query = from c in db.Categories select c;
  34. foreach (var item in query)
  35. {
  36. Console.WriteLine("类别:{0};说明:{1}", item.CategoryName, item.Description);
  37. }
  38. }
  39. #endregion
  40. Console.ReadKey();
  41. }
  42. }
  43. }

查看数据库:

嘎嘎! 一对多关系OK!Subcategories表的外键也不为空!

3.4示例三

我们再添加一个 Product.cs ,其代码:

  1. 隐藏代码using System.Collections.Generic;
  2. namespace Consoles.EF6.Models
  3. {
  4. public class Product
  5. {
  6. public int ProductId { get; set; }
  7. public string ProductName { get; set; }
  8. public ICollection<Subcategory> Subcategories { get; set; }
  9. }
  10. }

再修改 Subcategory.cs:

  1. 隐藏代码using System.Collections.Generic;
  2. namespace Consoles.EF6.Models
  3. {
  4. public class Subcategory
  5. {
  6. public int SubcategoryId { get; set; }
  7. public string SubcategoryName { get; set; }
  8. public int CategoryId { get; set; }
  9. public Category Category { get; set; }
  10. public ICollection<Product> Products { get; set; }
  11. }
  12. }

修改 EFContext.cs:

  1. 隐藏代码using Consoles.EF6.Models;
  2. using System.Data.Entity;
  3. namespace Consoles.EF6.Repositories
  4. {
  5. public class EFContext : DbContext
  6. {
  7. public EFContext() : base("DefaultConnection") { }
  8. public DbSet<Category> Categories { get; set; }
  9. public DbSet<Subcategory> Subcategories { get; set; }
  10. public DbSet<Product> Products { get; set; }
  11. protected override void OnModelCreating(DbModelBuilder modelBuilder)
  12. {
  13. modelBuilder.Entity<Category>().HasMany(s => s.Subcategories)
  14. .WithRequired(c => c.Category).HasForeignKey(f => f.CategoryId);
  15. modelBuilder.Entity<Category>().HasKey(k => k.CategoryId);
  16. modelBuilder.Entity<Category>().Property(p => p.CategoryName).HasMaxLength(20);
  17. modelBuilder.Entity<Subcategory>().HasKey(K => K.SubcategoryId);
  18. modelBuilder.Entity<Subcategory>().Property(p => p.SubcategoryName).IsRequired();
  19. modelBuilder.Entity<Product>().HasKey(k => k.ProductId);
  20. modelBuilder.Entity<Product>().Property(p => p.ProductName).HasMaxLength(120);
  21. modelBuilder.Entity<Subcategory>()
  22. .HasMany(c => c.Products).WithMany(p => p.Subcategories)
  23. .Map(t => t.MapLeftKey("SubCategoryId")
  24. .MapRightKey("ProductId")
  25. .ToTable("SubcategoryProduct"));
  26. }
  27. }
  28. }

查看数据库:

3.5初始化数据

前面我们是在 Main 方法写的模拟数据代码,是不是不太好?在“ 第05章 ”文中,我也说过有预留的问题,在这补充一下。

添加 SampleData.cs ,其代码:

  1. 隐藏代码using Consoles.EF6.Models;
  2. using System.Collections.Generic;
  3. using System.Data.Entity;
  4. using System.Linq;
  5. using System.Data.Entity.Migrations;
  6. namespace Consoles.EF6.Repositories
  7. {
  8. public class SampleData : DropCreateDatabaseIfModelChanges<EFContext>
  9. {
  10. protected override void Seed(EFContext db)
  11. {
  12. var categories = new List<Category>
  13. {
  14. new Category(){ CategoryName="Mobile",Description="手机大类"},
  15. new Category(){ CategoryName="Computer",Description="电脑大类"}
  16. };
  17. categories.ForEach(list => db.Categories.AddOrUpdate(c => c.CategoryId, list));
  18. db.SaveChanges();
  19. var subcategories = new List<Subcategory>
  20. {
  21. new Subcategory(){ SubcategoryName="2G",Category=db.Categories.Single(c=>c.CategoryName=="Mobile")},
  22. new Subcategory(){ SubcategoryName="3G",Category=db.Categories.Single(c=>c.CategoryName=="Mobile")},
  23. new Subcategory(){ SubcategoryName="4G",Category=db.Categories.Single(c=>c.CategoryName=="Mobile")},
  24. new Subcategory(){ SubcategoryName="Desktop",Category=db.Categories.Single(c=>c.CategoryName=="Computer")},
  25. new Subcategory(){ SubcategoryName="Tablet ",Category=db.Categories.Single(c=>c.CategoryName=="Computer")}
  26. };
  27. subcategories.ForEach(list => db.Subcategories.AddOrUpdate(c => c.SubcategoryId, list));
  28. db.SaveChanges();
  29. }
  30. }
  31. }

注:关于多对多关系的数据添加,参加" 第05章 "示例!

添加配置节点:

这样 只要有访问数据库 时,就会初始化数据了,如:

  1. 隐藏代码using Consoles.EF6.Models;
  2. using Consoles.EF6.Repositories;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Linq;
  6. using System.Data.Entity.Migrations;
  7. namespace Consoles.EF6
  8. {
  9. class Program
  10. {
  11. static void Main(string[] args)
  12. {
  13. using (var db = new EFContext())
  14. {
  15. var query = from c in db.Categories select c;
  16. foreach (var item in query)
  17. {
  18. Console.WriteLine("类别:{0};说明:{1}", item.CategoryName, item.Description);
  19. }
  20. }
  21. Console.ReadKey();
  22. }
  23. }
  24. }

我们并没在程序显式的代码中执行SampleData里的Seed方法,通过配置文件即可 (在不需要时,也可以 disableDatabaseInitialization 关闭).

4.EF7

4.1目录及说明

下面是用 VS2015 开发环境创建的项目:

说明:ASP.NET 5版的 WebApi 项目类型;

依赖和Commands配置:

commands之ef是迁移用的,这在“第06章”已经介绍过,这里会略过。

4.2示例

由于EF7暂时不直接支持 多对多 实体关系(也可能我了解有限),所以这里举例一对多。

Category.cs代码:

  1. 隐藏代码using System.Collections.Generic;
  2. namespace WebApies.EF7.Models
  3. {
  4. public class Category
  5. {
  6. public int CategoryId { get; set; }
  7. public string CategoryName { get; set; }
  8. public string Description { get; set; }
  9. public ICollection<Subcategory> Subcategories { get; set; }
  10. }
  11. }

Subcategory.cs代码:

  1. 隐藏代码namespace WebApies.EF7.Models
  2. {
  3. public class Subcategory
  4. {
  5. public int SubcategoryId { get; set; }
  6. public string SubcategoryName { get; set; }
  7. public int CategoryId { get; set; }
  8. public Category Category { get; set; }
  9. }
  10. }

EFContext.cs代码:

  1. 隐藏代码using Microsoft.Data.Entity;
  2. using WebApies.EF7.Models;
  3. using Microsoft.Data.Entity.Metadata;
  4. namespace WebApies.EF7.Repositories
  5. {
  6. public class EFContext : DbContext
  7. {
  8. public DbSet<Category> Categories { get; set; }
  9. public DbSet<Subcategory> Subcategories { get; set; }
  10. protected override void OnConfiguring(DbContextOptions options)
  11. {
  12. options.UseSqlServer(
  13. "Server=(localdb)\\mssqllocaldb;Database=TestDB;Trusted_Connection=True;MultipleActiveResultSets=true");
  14. }
  15. protected override void OnModelCreating(ModelBuilder modelBuilder)
  16. {
  17. modelBuilder.Entity<Category>().HasMany(C => C.Subcategories).WithOne().ForeignKey(f=>f.CategoryId);
  18. modelBuilder.Entity<Category>().Key(k => k.CategoryId);
  19. modelBuilder.Entity<Category>().Property(p => p.CategoryName).MaxLength(20);
  20. modelBuilder.Entity<Subcategory>().Key(K => K.SubcategoryId);
  21. modelBuilder.Entity<Subcategory>().Property(p => p.SubcategoryName).Required();
  22. }
  23. }
  24. }

迁移完毕后, 查看数据库:

注:MaxLength没有起作用!(完整版的sqlserver是正常的)

基架模板代码创建:

此时目录:

这是 T4模板代码,这个MVC版 的,webapi版本的还得等等了!

EntityFramework 6的更多相关文章

  1. EntityFramework Core Raw SQL

    前言 本节我们来讲讲EF Core中的原始查询,目前在项目中对于简单的查询直接通过EF就可以解决,但是涉及到多表查询时为了一步到位就采用了原始查询的方式进行.下面我们一起来看看. EntityFram ...

  2. 恋爱虽易,相处不易:当EntityFramework爱上AutoMapper

    剧情开始 为何相爱? 相处的问题? 女人的伟大? 剧情收尾? 有时候相识即是一种缘分,相爱也不需要太多的理由,一个眼神足矣,当EntityFramework遇上AutoMapper,就是如此,恋爱虽易 ...

  3. 关于这段时间学习 EntityFramework的 一点感悟

    Ado.Net,用了N多年,Entity Framework也关注了很多年. 每当项目转型的时候,就花费大巴的时间,学习一番,潮流的东西. 这个Orm很多,这个EF很火,这么多年了,我还是不敢用,虽然 ...

  4. 采用EntityFramework.Extended 对EF进行扩展(Entity Framework 延伸系列2)

    前言 Entity Framework 延伸系列目录 今天我们来讲讲EntityFramework.Extended 首先科普一下这个EntityFramework.Extended是什么,如下: 这 ...

  5. 一次修改闭源 Entity Provider 程序集以兼容新 EntityFramework 的过程

    读完本文你会知道,如何在没有源码的情况下,直接修改一个 DLL 以去除 DLL 上的强命名限制,并在该程序集上直接添加你的“友元程序集(一种特殊的 Attribute,将它应用在程序集上,使得程序集内 ...

  6. ABP文档 - EntityFramework 集成

    文档目录 本节内容: Nuget 包 DbContext 仓储 默认仓储 自定义仓储 特定的仓储基类 自定义仓储示例 仓储最佳实践 ABP可使用任何ORM框架,它已经内置了EntityFrame(以下 ...

  7. EntityFramework Core 1.1 Add、Attach、Update、Remove方法如何高效使用详解

    前言 我比较喜欢安静,大概和我喜欢研究和琢磨技术原因相关吧,刚好到了元旦节,这几天可以好好学习下EF Core,同时在项目当中用到EF Core,借此机会给予比较深入的理解,这里我们只讲解和EF 6. ...

  8. 神马玩意,EntityFramework Core 1.1又更新了?走,赶紧去围观

    前言 哦,不搞SQL了么,当然会继续,周末会继续更新,估计写完还得几十篇,但是我会坚持把SQL更新完毕,绝不会烂尾,后续很长一段时间没更新的话,不要想我,那说明我是学习新的技能去了,那就是学习英语,本 ...

  9. 问题记录:EntityFramework 一对一关系映射

    EntityFramework 一对一关系映射有很多种,比如主键作为关联,配置比较简单,示例代码: public class Teacher { public int Id { get; set; } ...

  10. EntityFramework.Extended 支持 MySql

    EntityFramework.Extended 默认不支持 MySql,需要配置如下代码: [DbConfigurationType(typeof(DbContextConfiguration))] ...

随机推荐

  1. 认识epoll

    linux下的epoll(7)函数,其有着良好的就绪事件通知机制.Epoll 是被linux2.6开始引进的,但是不被其他的类UNIX系统支持,它提供了一种类似select或poll函数的机制:a. ...

  2. LightOJ - 1247 Matrix Game (Nim博弈)题解

    题意: 给一个矩阵,每一次一个玩家可以从任意一行中选任意数量的格子并从中拿石头(但最后总数要大于等于1),问你谁赢 思路: 一开始以为只能一行拿一个... 将每一行石子数相加就转化为经典的Nim博弈 ...

  3. UVA 11806 Cheerleaders (容斥原理

    1.题意描述 本题大致意思是讲:给定一个广场,把它分为M行N列的正方形小框.现在给定有K个拉拉队员,每一个拉拉队员需要站在小框内进行表演.但是表演过程中有如下要求: (1)每一个小框只能站立一个拉拉队 ...

  4. 《重构网络:SDN架构与实现》Chapter7 SDN与网络虚拟化 随笔

    参考: <重构网络:SDN架构与实现>,作者:杨泽卫.李呈. Chapter7 SDN与网络虚拟化 结构 7.1 网络虚拟化 7.1.1 为什么需要网络虚拟化技术 7.1.2 网络虚拟化 ...

  5. for循环,定时器,闭包混合一块的那点事。

    1,对于一个基本的for循环,顺序输出变量值. for(var i = 1; i < 4; i++){ console.log(i);//结果不多说了吧 } 2,如果for循环中有定时器,如下代 ...

  6. Linux 普通用户拿到root权限及使用szrz命令上传下载文件

    1.如何拿到root权限 在shell里如果看到你的命令输入行最前面显示的是 $符号,说明目前账号只有系统的普通权限. 输入:sudo su 这时能看到shell的输入行最前面已经显示的是#号,说明已 ...

  7. poj 2186 Popular Cows tarjan

    Popular Cows Description Every cow's dream is to become the most popular cow in the herd. In a herd ...

  8. python 集合交集

    #Intersection setx = set(["green", "blue"]) sety = set(["blue", " ...

  9. Ubuntu 定时任务

        一.cron相关命令 #重载cron sudo service cron reload   #查看cron状态 service cron status   #查看cron pid pidof ...

  10. MongoDB(课时10 数组)

    3.4.2.5 数组查询 MongoDB里面支持数组保存,一旦支持数组保存,就需要对于数组的数据进行匹配. 范例:插入一部分数组内容 课程是数组的形式(截图时少截一条信息) 此时数据包含数组内容,而后 ...