首頁 > 資料庫 > mysql教程 > 学习EF之CodeFirst二(数据库对应映射)

学习EF之CodeFirst二(数据库对应映射)

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
發布: 2016-06-07 15:11:09
原創
1646 人瀏覽過

一:Data Annotations 此方法是利用在实体的那个属性里增加特性来进行操作控制;这些特性是在using System.ComponentModel.DataAnnotations下,要引用DLL using System.ComponentModel.DataAnnotations; namespace ModelLib{ public class Car { [Key] publi

一:Data Annotations

此方法是利用在实体的那个属性里增加特性来进行操作控制;这些特性是在using System.ComponentModel.DataAnnotations下,要引用DLL

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

<span>using</span><span> System.ComponentModel.DataAnnotations;

</span><span>namespace</span><span> ModelLib

{

    </span><span>public</span> <span>class</span><span> Car

    {

        [Key]

        </span><span>public</span> <span>int</span> ID { <span>get</span>; <span>set</span><span>; }

 

        [Required(ErrorMessage</span>=<span>"</span><span>不能为空</span><span>"</span><span>)]

        </span><span>public</span> <span>string</span> CarNum { <span>get</span>; <span>set</span><span>; }

 

        [StringLength(</span><span>10</span>,ErrorMessage=<span>"</span><span>最大长度不能超过10个字符</span><span>"</span><span>)]

        </span><span>public</span> <span>string</span> Colour { <span>get</span>; <span>set</span><span>; }

 

        [Range(</span><span>1</span>,<span>10</span>,ErrorMessage=<span>"</span><span>UserYear取证范围在1-10之间</span><span>"</span><span>)]

        </span><span>public</span> <span>int</span> UserYear { <span>get</span>; <span>set</span><span>; }

 

        [RegularExpression(</span><span>@"</span><span>^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$</span><span>"</span><span>)]

        </span><span>public</span> <span>string</span> Email { <span>get</span>; <span>set</span><span>; }

    }

}</span>

登入後複製

假如我们代码没有按照上面规定来便会报出异常:
学习EF之CodeFirst二(数据库对应映射)

上面只是列出一部分的特性,其它特性可以查MSDN:http://msdn.microsoft.com/zh-cn/library/system.componentmodel.dataannotations.aspx

学习EF之CodeFirst二(数据库对应映射)

学习EF之CodeFirst二(数据库对应映射)

学习EF之CodeFirst二(数据库对应映射)

 

二:Fluent API(推荐使用,因为前一种范围有限)

1:我们可以在EF上下文里重写OnModelCreating然后对要设置的属性进行操作,但是这样一个实体类如果有3个属性需要配置,10个实体类就需要配置30个,那么就得在OnModelCreating方法里写30行,很麻烦且不易维护,所以一般不这么编写;

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

<span>using</span><span> System.Data.Entity;

</span><span>using</span><span> ModelLib;

</span><span>namespace</span><span> DataLibrary

{

    </span><span>public</span> <span>class</span><span> MyDbContext : DbContext

    {

        </span><span>public</span><span> MyDbContext()

            : </span><span>base</span>(<span>"</span><span>name=MyTestDb</span><span>"</span><span>)

        {

        }

 

        </span><span>protected</span> <span>override</span> <span>void</span><span> OnModelCreating(DbModelBuilder modelBuilder)

        {

            modelBuilder.Entity</span><home>().HasKey(d =><span> d.ID);

            modelBuilder.Entity</span><home>().Property(d =><span> d.Address).IsRequired();

            modelBuilder.Entity</span><person>().Property(p => p.PassWord).HasMaxLength(<span>50</span><span>);

        }

 

 

        </span><span>public</span> DbSet<person> Person { <span>get</span>; <span>set</span><span>; }

 

        </span><span>public</span> DbSet<home> Home { <span>get</span>; <span>set</span><span>; }

 

        </span><span>public</span> DbSet<car> Car { <span>get</span>; <span>set</span><span>; }

    }

}</span></car></home></person></person></home></home>

登入後複製

2:注意返回值可以看出modelBuilder的Entity泛型方法的返回值是EntityTypeConfiguration泛型类。我们可以定义一个继承自EntityTypeConfiguration泛型类的类来定义domain中每个类的数据库配置。
ok,我们在DataAccess类库下新建一个继承自EntityTypeConfiguration泛型类的DestinationMap类,在构造函数里写上配置:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

<span>using</span><span> System.Data.Entity.ModelConfiguration;

</span><span>using</span><span> System.Linq;

</span><span>using</span><span> System.Text;

</span><span>using</span><span> ModelLib;

</span><span>namespace</span><span> DataLibrary

{

    </span><span>public</span> <span>class</span> HomeMap:EntityTypeConfiguration<home><span>

    {

        </span><span>public</span><span> HomeMap()

        {

            Property(d </span>=><span> d.Address).IsRequired();

        }

    }

}</span></home>

登入後複製

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

<span>using</span><span> System.Data.Entity.ModelConfiguration;

</span><span>using</span><span> System.Linq;

</span><span>using</span><span> System.Text;

</span><span>using</span><span> ModelLib;

 

</span><span>namespace</span><span> DataLibrary

{

    </span><span>public</span> <span>class</span> PersonMap:EntityTypeConfiguration<person><span>

    {

        </span><span>public</span><span> PersonMap()

        {

            Property(d </span>=><span> d.Age).IsRequired();

        }

    }

}</span></person>

登入後複製

然后修改EF上下文:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

<span>using</span><span> System.Data.Entity;

</span><span>using</span><span> ModelLib;

</span><span>namespace</span><span> DataLibrary

{

    </span><span>public</span> <span>class</span><span> MyDbContext : DbContext

    {

        </span><span>public</span><span> MyDbContext()

            : </span><span>base</span>(<span>"</span><span>name=MyTestDb</span><span>"</span><span>)

        {

        }

 

 

        </span><span>protected</span> <span>override</span> <span>void</span><span> OnModelCreating(DbModelBuilder modelBuilder)

        {

            modelBuilder.Configurations.Add(</span><span>new</span><span> HomeMap());

            modelBuilder.Configurations.Add(</span><span>new</span><span> PersonMap());

        }

 

        </span><span>public</span> DbSet<person> Person { <span>get</span>; <span>set</span><span>; }

 

        </span><span>public</span> DbSet<home> Home { <span>get</span>; <span>set</span><span>; }

 

        </span><span>public</span> DbSet<car> Car { <span>get</span>; <span>set</span><span>; }

    }

}</span></car></home></person>

登入後複製

下面是一些常用的设置:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

<span>//</span><span>【主键】

</span><span>//</span><span>Data Annotations:</span>

<span>[Key]

</span><span>public</span> <span>int</span> DestinationId { <span>get</span>; <span>set</span><span>; }

 

</span><span>//</span><span>Fluent API:</span>

<span>public</span> <span>class</span><span> BreakAwayContext : DbContext

{

    </span><span>protected</span> <span>override</span> <span>void</span><span> OnModelCreating(DbModelBuilder modelBuilder)

    {

        modelBuilder.Entity</span><destination>().HasKey(d =><span> d.DestinationId);

    }

}

 

</span><span>//</span><span>【外键】

</span><span>//</span><span>Data Annotations:</span>

<span>public</span> <span>int</span> DestinationId { <span>get</span>; <span>set</span><span>; }

[ForeignKey(</span><span>"</span><span>DestinationId</span><span>"</span><span>)]

</span><span>public</span> Destination Destination { <span>get</span>; <span>set</span><span>; }

 

</span><span>//</span><span>Fluent API:</span>

modelBuilder.Entity<lodging>().HasRequired(p => p.Destination).WithMany(p=>p.Lodgings).HasForeignKey(p =><span> p.DestinationId);

 

</span><span>//</span><span>【长度】

</span><span>//</span><span>Data Annotations:通过StringLength(长度),MinLength(最小长度),MaxLength(最大长度)来设置数据库中字段的长度</span>

[MinLength(<span>10</span>),MaxLength(<span>30</span><span>)]

</span><span>public</span> <span>string</span> Name { <span>get</span>; <span>set</span><span>; }

[StringLength(</span><span>30</span><span>)]

</span><span>public</span> <span>string</span> Country { <span>get</span>; <span>set</span><span>; }

 

</span><span>//</span><span>Fluent API:没有设置最小长度这个方法</span>

modelBuilder.Entity<destination>().Property(p => p.Name).HasMaxLength(<span>30</span><span>);

modelBuilder.Entity</span><destination>().Property(p => p.Country).HasMaxLength(<span>30</span><span>);

 

</span><span>//</span><span>【非空】

</span><span>//</span><span>Data Annotations:</span>

[Required(ErrorMessage=<span>"</span><span>请输入描述</span><span>"</span><span>)]

</span><span>public</span> <span>string</span> Description { <span>get</span>; <span>set</span><span>; }

 

</span><span>//</span><span>Fluent API:</span>

modelBuilder.Entity<destination>().Property(p =><span> p.Country).IsRequired();

 

</span><span>//</span><span>【数据类型】</span>

<span>Data Annotations:

将string映射成ntext,默认为nvarchar(max)

[Column(TypeName </span>= <span>"</span><span>ntext</span><span>"</span><span>)]

</span><span>public</span> <span>string</span> Owner { <span>get</span>; <span>set</span><span>; }

 

</span><span>//</span><span>Fluent API:</span>

modelBuilder.Entity<lodging>().Property(p => p.Owner).HasColumnType(<span>"</span><span>ntext</span><span>"</span><span>);

 

</span><span>//</span><span>【表名】

</span><span>//</span><span>Data Annotations:</span>

[Table(<span>"</span><span>MyLodging</span><span>"</span><span>)]

</span><span>public</span> <span>class</span><span> Lodging

{

}

 

</span><span>//</span><span>Fluent API</span>

modelBuilder.Entity<lodging>().ToTable(<span>"</span><span>MyLodging</span><span>"</span><span>);

 

</span><span>//</span><span>【列名】

</span><span>//</span><span>Data Annotations:</span>

[Column(<span>"</span><span>MyName</span><span>"</span><span>)]

</span><span>public</span> <span>string</span> Name { <span>get</span>; <span>set</span><span>; }

 

</span><span>//</span><span>Fluent API:</span>

modelBuilder.Entity<lodging>().Property(p => p.Name).HasColumnName(<span>"</span><span>MyName</span><span>"</span><span>);

 

</span><span>//</span><span>【自增长】

</span><span>//</span><span>Data Annotations</span>

<span>[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]  Guid类型的主键、自增长

</span><span>public</span> Guid SocialId { <span>get</span>; <span>set</span><span>; }

 

</span><span>//</span><span>Fluent API:</span>

modelBuilder.Entity<person>().Property(p =><span> p.SocialId).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);

 

</span><span>//</span><span>【忽略列映射】

</span><span>//</span><span>Data Annotations:</span>

<span>[NotMapped]

</span><span>public</span> <span>string</span><span> Name

{

    </span><span>get</span><span>

    {

        </span><span>return</span> FirstName + <span>"</span> <span>"</span> +<span> LastName;

    }

}

 

</span><span>//</span><span>Fluent API:</span>

modelBuilder.Entity<person>().Ignore(p =><span> p.Name);

 

</span><span>//</span><span>【忽略表映射】

</span><span>//</span><span>Data Annotations:</span>

<span>[NotMapped]

</span><span>public</span> <span>class</span><span> Person

{ }

 

</span><span>//</span><span>Fluent API:</span>

modelBuilder.Ignore<person><span>();

 

</span><span>//</span><span>【时间戳】

</span><span>//</span><span>Data Annotations:Timestamp</span>

<span>1441598336

</span><span>public</span> Byte[] TimeStamp { <span>get</span>; <span>set</span><span>; }   只能是byte类型

 

</span><span>//</span><span>Fluent API:</span>

modelBuilder.Entity<lodging>().Property(p =><span> p.TimeStamp).IsRowVersion();

 

</span><span>//</span><span>【复杂类型】

</span><span>//</span><span>Data Annotations:</span>

<span> [ComplexType]

 </span><span>public</span> <span>class</span><span> Address

 {

     </span><span>public</span> <span>string</span> Country { <span>get</span>; <span>set</span><span>; }

     </span><span>public</span> <span>string</span> City { <span>get</span>; <span>set</span><span>; }

 }

 

</span><span>//</span><span>Fluent API:</span>

modelBuilder.ComplexType<address>();</address></lodging></person></person></person></lodging></lodging></lodging></destination></destination></destination></lodging></destination>

登入後複製

 

 

相關標籤:
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板