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用法探索系列

完整代码下载







本文转自匠心十年博客园博客,原文链接:http://www.cnblogs.com/gaochundong/archive/2013/06/06/entityframework_usage_code_first_fluent_api.html,如需转载请自行联系原作者
目录
相关文章
|
3月前
|
JavaScript API 开发工具
uni.app cell的用法以及相关api
uni.app cell的用法以及相关api
26 0
|
JSON API 数据格式
Postman 导入导出API 的用法
大家好,我是阿萨。昨天学习了如何使用Postman里的collections?关于API 脚本的最基本场景我们就学习完成了。 日常工作中会碰到各种各样的情况需要导入或者导出API。
1000 0
Postman 导入导出API 的用法
|
4月前
|
JSON API 数据格式
Postman 导入导出API 的用法
Postman 导入导出API 的用法
108 0
|
4月前
|
缓存 JavaScript API
最新,Vue 改进了响应式 API 中 getter 的用法!
最新,Vue 改进了响应式 API 中 getter 的用法!
|
5月前
|
JavaScript 前端开发 API
Vue3 组合式 API 的特性、用法和最佳实践
Vue3 组合式 API 的特性、用法和最佳实践
95 1
|
7月前
|
JavaScript 前端开发 API
通过一个实际例子,理解 SAP UI5 sap.ui.model.odata.v2.ODataModel API 中 BindingContext 绑定上下文的概念和用法试读版
通过一个实际例子,理解 SAP UI5 sap.ui.model.odata.v2.ODataModel API 中 BindingContext 绑定上下文的概念和用法试读版
42 0
|
7月前
|
中间件 API
关于 Express API app.use 中的 path 参数用法
关于 Express API app.use 中的 path 参数用法
37 0
关于 Express API app.use 中的 path 参数用法
|
7月前
|
JavaScript 网络协议 前端开发
关于 Node.js Stream API 的用法概述
关于 Node.js Stream API 的用法概述
31 0
|
11月前
|
存储 Kubernetes Linux
【探索 Kubernetes|作业管理篇 系列 8】探究 Pod 的 API 对象属性级别与重要字段用法
【探索 Kubernetes|作业管理篇 系列 8】探究 Pod 的 API 对象属性级别与重要字段用法
68 1
|
JavaScript 前端开发 API
通过一个实际例子,理解 SAP UI5 sap.ui.model.odata.v2.ODataModel API 中 BindingContext 绑定上下文的概念和用法试读版
通过一个实际例子,理解 SAP UI5 sap.ui.model.odata.v2.ODataModel API 中 BindingContext 绑定上下文的概念和用法试读版