EF Code First默认规则及配置
2015-06-09 15:27
281 查看
转载地址:http://www.cnblogs.com/libingql/archive/2012/03/26/2418588.html
一、EF Code First默认规则(Convention)
1、表及列默认规则
EF Code First默认生成的表名为类名的复数形式,表的生成为dbo用户,列名与实体类属性名称相同。
2、主键约束
实体类中属性名为Id或[类名]Id,将作为生成表的主键。若主键为int类型,则默认为Sql Server的Identity类型。
3、字符类型属性
实体类中string类型的属性,在生成表时,对应Sql Server中nvarchar(max)类型。
4、Byte Array类型约束
实体类中byte[]类型的属性,生成表时对应Sql Server中varbinary(max)类型。
5、Boolean类型约束
实体类中bool类型的属性,在生成表是对应Sql Server中bit类型。
二、配置约束
配置约束的两种方式:attribute-based Data Annotations和strongly typed Fluent API。
1、使用Data Annotations配置
Data Annotations使用命名空间System.ComponentModel.DataAnnotations。
在上一节示例代码中Domain添加EntityFramework引用,修改Domain中Category.cs代码.
修改App中Program.cs代码:
运行成功后生成的数据库如下:
2、使用Fluent API配置
Fluent API通过重写DbContext.OnModelCreating方法实现修改Code First默认约束。
修改Domain中Category.cs代码:
修改Data中NorthwindContext.cs代码:
执行成功后生成的数据:
Fluent API重写调整解决方案结构,在Domain中添加Mapping文件夹:
Domain中Category.cs:
Domain中CategoryMap.cs:
Data中NorthwindContext.cs:
App中Program.cs:
以上内容为EF Code First基本的默认规则及简单配置,下一节我们将进行详细的深入EF Code First规则。
一、EF Code First默认规则(Convention)
1、表及列默认规则
EF Code First默认生成的表名为类名的复数形式,表的生成为dbo用户,列名与实体类属性名称相同。
2、主键约束
实体类中属性名为Id或[类名]Id,将作为生成表的主键。若主键为int类型,则默认为Sql Server的Identity类型。
3、字符类型属性
实体类中string类型的属性,在生成表时,对应Sql Server中nvarchar(max)类型。
4、Byte Array类型约束
实体类中byte[]类型的属性,生成表时对应Sql Server中varbinary(max)类型。
5、Boolean类型约束
实体类中bool类型的属性,在生成表是对应Sql Server中bit类型。
二、配置约束
配置约束的两种方式:attribute-based Data Annotations和strongly typed Fluent API。
1、使用Data Annotations配置
Data Annotations使用命名空间System.ComponentModel.DataAnnotations。
在上一节示例代码中Domain添加EntityFramework引用,修改Domain中Category.cs代码.
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 using System.ComponentModel.DataAnnotations; 7 8 namespace Northwind.Domain.Entities 9 { 10 public class Category 11 { 12 /// <summary> 13 /// 分类ID 14 /// </summary> 15 [Key] 16 public int CategoryID { get; set; } 17 18 /// <summary> 19 /// 分类名称 20 /// </summary> 21 [Required] 22 [MaxLength(15)] 23 public string CategoryName { get; set; } 24 25 /// <summary> 26 /// 描述 27 /// </summary> 28 public string Description { get; set; } 29 30 /// <summary> 31 /// 图片 32 /// </summary> 33 [Column(TypeName="image")] 34 public byte[] Picture { get; set; } 35 } 36 }
修改App中Program.cs代码:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 using Northwind.Data; 7 using Northwind.Domain.Entities; 8 9 using System.Data.Entity; 10 11 namespace Northwind.App 12 { 13 class Program 14 { 15 static void Main(string[] args) 16 { 17 // 数据模型改变,删除数据库重新创建。 18 Database.SetInitializer(new DropCreateDatabaseIfModelChanges<NorthwindContext>()); 19 20 Category c = new Category() { CategoryName = "电子数码" }; 21 22 using (NorthwindContext db = new NorthwindContext()) 23 { 24 db.Categories.Add(c); 25 db.SaveChanges(); 26 } 27 28 Console.WriteLine("Finish"); 29 Console.ReadKey(); 30 } 31 } 32 }
运行成功后生成的数据库如下:
2、使用Fluent API配置
Fluent API通过重写DbContext.OnModelCreating方法实现修改Code First默认约束。
修改Domain中Category.cs代码:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 using System.ComponentModel.DataAnnotations; 7 8 namespace Northwind.Domain.Entities 9 { 10 public class Category 11 { 12 /// <summary> 13 /// 分类ID 14 /// </summary> 15 public int CategoryID { get; set; } 16 17 /// <summary> 18 /// 分类名称 19 /// </summary> 20 public string CategoryName { get; set; } 21 22 /// <summary> 23 /// 描述 24 /// </summary> 25 public string Description { get; set; } 26 27 /// <summary> 28 /// 图片 29 /// </summary> 30 public byte[] Picture { get; set; } 31 } 32 }
修改Data中NorthwindContext.cs代码:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 using System.Data.Entity; 7 8 using Northwind.Domain.Entities; 9 10 namespace Northwind.Data 11 { 12 public class NorthwindContext : DbContext 13 { 14 public DbSet<Category> Categories { get; set; } 15 16 protected override void OnModelCreating(DbModelBuilder modelBuilder) 17 { 18 modelBuilder.Entity<Category>().ToTable("Category"); 19 //modelBuilder.Entity<Category>().ToTable("dbo.Category"); // 指定用户 20 21 modelBuilder.Entity<Category>().HasKey(t => t.CategoryID); 22 modelBuilder.Entity<Category>().Property(t => t.CategoryName).IsRequired().HasMaxLength(15); 23 modelBuilder.Entity<Category>().Property(t => t.Picture).HasColumnType("image"); 24 } 25 } 26 }
执行成功后生成的数据:
Fluent API重写调整解决方案结构,在Domain中添加Mapping文件夹:
Domain中Category.cs:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 using System.ComponentModel.DataAnnotations; 7 8 namespace Northwind.Domain.Entities 9 { 10 public class Category 11 { 12 /// <summary> 13 /// 分类ID 14 /// </summary> 15 public int CategoryID { get; set; } 16 17 /// <summary> 18 /// 分类名称 19 /// </summary> 20 public string CategoryName { get; set; } 21 22 /// <summary> 23 /// 描述 24 /// </summary> 25 public string Description { get; set; } 26 27 /// <summary> 28 /// 图片 29 /// </summary> 30 public byte[] Picture { get; set; } 31 } 32 }
Domain中CategoryMap.cs:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 using System.Data.Entity.ModelConfiguration; 7 using System.ComponentModel.DataAnnotations; 8 9 using Northwind.Domain.Entities; 10 11 namespace Northwind.Domain.Mapping 12 { 13 public class CategoryMap : EntityTypeConfiguration<Category> 14 { 15 public CategoryMap() 16 { 17 this.ToTable("dbo.Category"); 18 this.HasKey(t => t.CategoryID); 19 20 this.Property(t => t.CategoryID).HasDatabaseGeneratedOption(DatabaseGeneratedOption.None); // 取消主键Identity 21 this.Property(t => t.CategoryName).IsRequired().HasMaxLength(15); 22 this.Property(t => t.Picture).HasColumnType("image"); 23 } 24 } 25 }
Data中NorthwindContext.cs:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 using System.Data.Entity; 7 8 using Northwind.Domain.Entities; 9 using Northwind.Domain.Mapping; 10 11 namespace Northwind.Data 12 { 13 public class NorthwindContext : DbContext 14 { 15 public DbSet<Category> Categories { get; set; } 16 17 protected override void OnModelCreating(DbModelBuilder modelBuilder) 18 { 19 modelBuilder.Configurations.Add(new CategoryMap()); 20 } 21 } 22 }
App中Program.cs:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 using Northwind.Data; 7 using Northwind.Domain.Entities; 8 9 using System.Data.Entity; 10 11 namespace Northwind.App 12 { 13 class Program 14 { 15 static void Main(string[] args) 16 { 17 // 数据模型改变,删除数据库重新创建。 18 Database.SetInitializer(new DropCreateDatabaseIfModelChanges<NorthwindContext>()); 19 20 Category c = new Category() { CategoryID = 1, CategoryName = "电子数码" }; 21 22 using (NorthwindContext db = new NorthwindContext()) 23 { 24 db.Categories.Add(c); 25 db.SaveChanges(); 26 } 27 28 Console.WriteLine("Finish"); 29 Console.ReadKey(); 30 } 31 } 32 }
以上内容为EF Code First基本的默认规则及简单配置,下一节我们将进行详细的深入EF Code First规则。
相关文章推荐
- Linux内核实现List二个关键的宏offsetof 和 container_of
- Servlet学习(一)
- 解析利用wsdl.exe生成webservice代理类的详解
- 一个数据库的字段挪到另一个数据库
- 循环队列
- UVA 10462 Is There A Second Way Left? (次小生成树+kruskal)
- 基于netty 的android Socket 聊天室客户端
- GRE优秀作文范文鉴赏
- SAT作文素材--最好用历史或文学作例证
- 05-图1. List Components (25)
- 浅谈实现placeholder效果的几种方案
- VC++ 字符串赋值例子(2)
- tp 多条件查询 及 多表left join查询
- jsp页面常用控件
- ActivityManager.getRunningTasks笔记
- android 退出程序
- Apache代理和反向代理
- axel 原来求中点我想复杂了 两个结果一样
- spring的编程式事务、XML配置事务、注解实现事务
- COM学习笔记3_IUnknown的三个接口函数