Code First,顾名思义,要先写Code,而不是先建立数据库内容。

同样使用与上文 Database First 模式相同的例子,假设需要设计一个零售系统,我们先构建一个 Customer 类。

 1   [Table("Customer", Schema = "STORE")]
 2   public class Customer
 3   {
 4     [Key]
 5     [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
 6     public long Id { get; set; }
 7     public string Name { get; set; }
 8     public string Address { get; set; }
 9     public string Phone { get; set; }
10   }

通过使用TableAttribute来指定数据表名称和使用的SchemaName。

通过KeyAttribute来指定表主键,并通过DatabaseGeneratedAttribute来指定该主键为自增字段。

构建访问上下文,

 1   public class RetailEntities : DbContext
 2   {
 3     static RetailEntities()
 4     {
 5       //Database.SetInitializer<RetailEntities>(new CreateDatabaseIfNotExists<RetailEntities>());
 6       //Database.SetInitializer<RetailEntities>(new DropCreateDatabaseAlways<RetailEntities>());
 7       //Database.SetInitializer<RetailEntities>(new DropCreateDatabaseIfModelChanges<RetailEntities>());
 8       Database.SetInitializer<RetailEntities>(null);
 9     }
10
11     public RetailEntities()
12       : base("Name=RetailEntities")
13     {
14     }
15
16     public DbSet<Customer> Customers { get; set; }
17   }

其中包含了几种数据库初始化选项,

  • CreateDatabaseIfNotExists 如果数据库不存在则创建。
  • DropCreateDatabaseAlways 总是先删除已有数据库并创建新的。
  • DropCreateDatabaseIfModelChanges 判断如果模型有修改在重建数据库。

同时需要在配置文件中指定数据库访问字符串,

  <connectionStrings><add name="RetailEntities" connectionString="Data Source=localhost\DENNIS;Initial Catalog=RETAIL;Integrated Security=True;MultipleActiveResultSets=True;Application Name=WhenEntityFrameworkMeetUnity;" providerName="System.Data.SqlClient" /></connectionStrings>

这样,就可以构建同样的增删改查功能了。参考上文DatabaseFirst中定义个ICustomerRepository接口。

 1     public void InsertCustomer(DomainModels.Customer customer)
 2     {
 3       using (RetailEntities context = new RetailEntities())
 4       {
 5         Customer entity = Mapper.Map<DomainModels.Customer, Customer>(customer);
 6         context.Customers.Add(entity);
 7         context.SaveChanges();
 8
 9         customer.Id = entity.Id;
10       }
11     }
12
13     public void UpdateCustomer(DomainModels.Customer customer)
14     {
15       using (RetailEntities context = new RetailEntities())
16       {
17         Customer entity = context.Customers.AsQueryable().Single(c => c.Id == customer.Id);
18
19         entity.Name = customer.Name;
20         entity.Address = customer.Address;
21         entity.Phone = customer.Phone;
22
23         context.SaveChanges();
24       }
25     }

具体使用,

 1       ICustomerRepository customerRepository = new CustomerRepository();
 2
 3       // =============== 增 ===============
 4       Console.ForegroundColor = ConsoleColor.DarkRed;
 5
 6       DomainModels.Customer customer1 = new DomainModels.Customer()
 7       {
 8         Name = "Dennis Gao",
 9         Address = "Beijing",
10         Phone = "18888888888",
11       };
12       customerRepository.InsertCustomer(customer1);
13       Console.WriteLine(customer1);

完整代码和索引

EntityFramework用法探索系列

  • (一)DatabaseFirst
  • (二)CodeFirst
  • (三)CodeFirst流畅API
  • (四)Repository和UnitOfWork
  • (五)引入Unity
  • (六)静态Repository
  • (七)线程安全实践
  • (八)事务处理

完整代码下载

EntityFramework用法探索(二)CodeFirst相关推荐

  1. EntityFramework用法探索(三)CodeFirst流畅API

    Code First Fluent API,使用流畅API来定义模型映射. 同样使用与上文 Database First 模式相同的例子,假设需要设计一个零售系统,我们先构建一个 Customer 类 ...

  2. EntityFramework用法探索(一)DatabaseFirst

    EntityFramework数据库优先方式,很明显,我们需要先设计数据库模型. 假设我们需要设计一个零售系统,需要一些表结构: 生成数据库建表SQL  View Code 生成数据库表 然后生成AD ...

  3. 【深度学习】DIY 人脸识别技术的探索(二)

    [深度学习]DIY 人脸识别技术的探索(二) 文章目录 训练模型 工具 结果展示 问题二的模型建立与求解 基于 KNN 的人脸识别模型 训练模型 MTCNN 可以并行训练(3 个网络同时训练,前提是内 ...

  4. Python Pillow(PIL)库的用法介绍(二)

    Python Pillow(PIL)库的用法介绍(二) 在上一篇文章中介绍了Pillow库的一些基本用法,参考:https://blog.csdn.net/weixin_43790276/articl ...

  5. 【零基础学Java】—final关键字与四种用法(二十九)

    [零基础学Java]-final关键字与四种用法(二十九) 一.final关键字 final关键字代表最终.不可改变的 常见的四种用法: 可以用来修饰一个类 可以用来修饰一个方法 可以用来修饰一个局部 ...

  6. Redis Sentinel 机制与用法(二)

    本专栏与Redis相关的文章 Redis Sentinel机制与用法(一) Redis Sentinel机制与用法(二) Jedis的JedisSentinelPool源代码分析 Jedis的Shar ...

  7. Excel函数之— SUMPRODUCT用法(二),太强大了

    上一篇文章给大家介绍了SUMPRODUCT的求和用法,今天给大家介绍用 SUMPRODUCT来统计的用法 SUMPRODUCT 函数功能 SUMproduc先计算多个数组的元素之间的乘积再求和 SUM ...

  8. Web scraper使用教程-进阶用法(二)-爬取二级页面内容

    进阶用法(二)-爬取二级页面内容 1. 爬取网址 https://docs.microsoft.com/en-us/officeupdates/update-history-microsoft365- ...

  9. MySQL中的关键字用法(二)

    MySQL中的关键字的用法(二) limit:偏移量和数量 注意limit和offset的区别,下面有写到offset,注意区分: 在我们使用查询语句的时候,经常要返回前几条或者中间某几行数据,这个时 ...

最新文章

  1. 中国LINUX内核开发大会 ppt演讲资料 与 会议视频
  2. 大数据时代千帆竞发,三代测序激流勇进
  3. Linux下通过源码编译安装程序
  4. c语言sleep_编程代码:用C语言来实现下雪效果,这个冬天,雪花很美
  5. cocos2dX改变锚点位置
  6. Ubuntu的中文是哪种字体?python的词云分析和 三国演义人物出场统计
  7. 前端学习(1370):错误处理中间件
  8. C++:17---函数指针
  9. IDEA依赖冲突分析神器—Maven Helper
  10. Lync Server 2010标准版系列PART3:证书准备
  11. 安卓添加滚轮代码_[按键精灵手机版教程]安卓实战——制作天天酷跑脚本(2)...
  12. 西南财大计算机学院官网,西南财经大学
  13. xshell的一些常用配置
  14. 数据库事务的四大特性以及事务的隔离级别-与-Spring事务传播机制隔离级别
  15. 现代通信原理A.1-a:仿真确定信号波形与频谱(Matlab版)
  16. 神策分析 1.13 版本用户分群全新升级,为企业打磨­­­­­­­­­精细化运营基石
  17. 超级简单的三次方程求解!
  18. linux 嵌入式开发常用网站整理
  19. Django框架之DRF框架
  20. 基于CCE Kubernetes网络与持久化存储实战

热门文章

  1. 在eclipse中使用JDBC连接MySQL5.7.24
  2. Perfect service(树形dp)
  3. 初入android驱动开发之字符设备(一)
  4. Vm-Tools 安装指南
  5. [JavaWeb基础] 018.Struts2 Action通配符使用
  6. C++中的static关键字的总结
  7. Python数组操作2
  8. 标准浏览器的选择器封装
  9. 准备搭建经营分析前端试验型平台
  10. Linux入门第五集!MySQL8在Linux上的安装!MySQL的Linux资源分享!