EntityFramework用法探索(三)CodeFirst流畅API
Code First Fluent API,使用流畅API来定义模型映射。
同样使用与上文 Database First 模式相同的例子,假设需要设计一个零售系统,我们先构建一个 Customer 类。
1 public class Customer 2 { 3 public long Id { get; set; } 4 public string Name { get; set; } 5 public string Address { get; set; } 6 public string Phone { get; set; } 7 }
这次没有使用属性来指定对应表名称、主键等。
使用代码创建影射,
1 public class CustomerMap : EntityTypeConfiguration<Customer> 2 { 3 public CustomerMap() 4 { 5 // Primary Key 6 this.HasKey(t => t.Id); 7 8 // Properties 9 this.Property(t => t.Name) 10 .IsRequired() 11 .HasMaxLength(256); 12 13 this.Property(t => t.Phone) 14 .IsRequired() 15 .HasMaxLength(256); 16 17 // Table & Column Mappings 18 this.ToTable("Customer", "STORE"); 19 this.Property(t => t.Id).HasColumnName("Id"); 20 this.Property(t => t.Name).HasColumnName("Name"); 21 this.Property(t => t.Address).HasColumnName("Address"); 22 this.Property(t => t.Phone).HasColumnName("Phone"); 23 24 // Relationships 25 //this.HasRequired(t => t.Status) 26 // .WithMany(t => t.CustomerStatus) 27 // .HasForeignKey(d => d.Status); 28 } 29 }
在上下文对象中覆写OnModelCreating方法来添加影射配置,
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 18 protected override void OnModelCreating(DbModelBuilder modelBuilder) 19 { 20 modelBuilder.Configurations.Add(new CustomerMap()); 21 } 22 }
ICustomerRepository接口和实现依然类似,
1 public void InsertCustomer(DomainModels.Customer customer) 2 { 3 using (RETAILContext context = new RETAILContext()) 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 (RETAILContext context = new RETAILContext()) 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);
当然,你可能觉得手工写影射代码还是比较繁琐,如果已有部分数据表结构,希望反向生成代码,可使用工具 Entity Framework Power Tools 来生成。
Entity Framework Power Tools 拯救程序员啊。
完整代码和索引
EntityFramework用法探索系列
- (一)DatabaseFirst
- (二)CodeFirst
- (三)CodeFirst流畅API
- (四)Repository和UnitOfWork
- (五)引入Unity
- (六)静态Repository
- (七)线程安全实践
- (八)事务处理
完整代码下载
EntityFramework用法探索(三)CodeFirst流畅API相关推荐
- EntityFramework用法探索(二)CodeFirst
Code First,顾名思义,要先写Code,而不是先建立数据库内容. 同样使用与上文 Database First 模式相同的例子,假设需要设计一个零售系统,我们先构建一个 Customer 类. ...
- EntityFramework用法探索(一)DatabaseFirst
EntityFramework数据库优先方式,很明显,我们需要先设计数据库模型. 假设我们需要设计一个零售系统,需要一些表结构: 生成数据库建表SQL View Code 生成数据库表 然后生成AD ...
- 调用非.net系统的Webservice的探索 ( 三 ) -WCF
http://www.cnblogs.com/zitjubiz/archive/2011/09/27/WCF_Soap_Header.html 最近Oracle的DRM系统发布了新版本,其中的webS ...
- Fluent API — 流畅API(基于Java介绍)
Fluent API ,流畅API, 也称作流式API. Fluent API 是一种面向对象的API,主要基于方法链. 这个概念由Eric Evans和Martin Fowler于 2005 ...
- live http工具下载_使用通用测试工具探索Blueworks Live REST API资源
live http工具下载 本系列的第1部分介绍了5个一般用例,它们是使用IBM®Blueworks Live的代表性状态转移(REST)应用程序编程接口(API)的最佳方法. 您还为每种用例学习了不 ...
- 探索Elasticsearch集群API
Elasticsearch提供了一个非常全面和强大的REST API,您可以使用与您的集群进行交互.为数不多的可以用API的事情如下: 检查您的集群.节点和索引健康状态和统计数据 管理集群.节点和索引 ...
- Hadoop入门(三)HDFS API
一..HDFS 常用类 Configuration 配置 Path 路径 FileSystem 文件系统 Stream 流 IOUtils IO工具 API文档 二.类解析 (1)Confi ...
- 枚举类型用法_Mybatis-plus常见用法总结三
前面已经介绍了Mybatis-plus基本用法,今天为大家分享一些Mybatis-plus高级应用 逻辑删除 自动注入 枚举类型处理 Sql注入器 多租户 表结构 CREATE TABLE `sys_ ...
- C++开源矩阵计算工具——Eigen的简单用法(三)
本节主要涉及Eigen的块操作以及QR分解,Eigen的QR分解非常绕人,搞了很久才搞明白是怎么回事,最后是一个使用Eigen的矩阵操作完成二维高斯拟合求取光点的代码例子,关于二维高斯拟合求取光点的详 ...
最新文章
- SLAM Scan-Matching/Registration
- 由浅入深,走进Python装饰器-----第五篇:进阶--类装饰类
- 一个交换机到底能带几台摄像头
- SpringBoot v2.2.6 踩的坑 --- dubbo.scan.base_packages
- Java学习福利,入门到精通学习路线分享
- Linux下使用g++编译C++程序——Compiling Cpp
- 用自定义函数联合IF函数实现“一对多”查询
- 关于github的一些问题汇总
- 使用PacketSifter从pcap中筛选有价值的信息
- Oracle数据库日志清理
- CSDN上传资源无法设置积分了吗
- SmartForms 取消Word编辑器 恢复文本编辑器
- Quorum (分布式系统)
- com.googlecode.genericdao
- 一个基于腾讯云实时音视频的SDKdemo
- OpenScap基础应用
- 怎么选择WiFi短信认证硬件供应商?
- 2.25嵌入式设计(总结)
- Unfortunately XXX has stopped. 系统应用安装后导致其他应用
- Apache LICENSE 2.0 授权介绍