EF Code First默认规则及配置

转载地址: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代码.

复制代码
 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规则。

展开阅读全文

没有更多推荐了,返回首页