Entity Framework4.2 (十)CodeFirst(EF4 .2的Code First方法)

长假归来,祝大家:龙年吉祥,龙马精神;福旺财旺事业旺,旺上加旺!!

差不多一个月没登录博客园了,呵呵。非常抱歉啦。

好了,闲言少叙,书归正传。呵呵。

==================================================

前面我有写过一篇《Entity Framework4.0 (三)概述(EF4 的Code First方法)》,目的是为了演示一下CodeFirst是怎么一回事。文章中的写法有些过时了,所以并不是项目中的推荐做法(Best Practice)。因为,现在我们使用功能更为完整的EF4.2的CodeFirst方法。

下面我们就开始喽!

说明:我们有两种方式添加EntityFramework.dll的引用:

1)使用NuGet将自动添加的是最新版本的EntityFramework 就是EF4.2的Dll。

 EF4.2和EF4.1的区别就是修改了一个Bug: 详情参考:http://blogs.msdn.com/b/adonet/archive/2011/11/01/ef-4-2-released.aspx

2)手动添加本地EntityFramework.dll引用的话,只能添加EF4.1而不是EF4.2,所以要下载安装EntityFramework41RC.下载地址:http://www.microsoft.com/download/en/details.aspx?id=18504

 因为使用EF4.2的dll,所以我们先简单介绍在VS2010中的小插件Nuget的使用(它可以帮助我们引入EntitiFramework.dll),并且我们有了NuGet的帮助,就没有必要下载安装EntityFramework41RC,更不必要安装更老的EF版本的CTP了(但是我以自己的血的教训建议你不要试图卸载之前版本的EntityFramework的CTP或RC,因为那样有可能会引起你的.Net Framework 或 VS2010出现问题滴)

说明:你也可以不安装这个很Cool的工具(但是那样你就只能手动添加EF4.1的dll了)

安装完成以后,为了安全起见,最好重启下VS2010.

打开一个NuGet的命令行窗体,如果显示:

Type 'get-help NuGet' to see all available NuGet commands.

表示安装Nuget成功。

如果你使用的是Xp SP3的操作系统,有可能因为缺少Power shell2.0而提示出错。

此时只需要安装Power Shell2.0即可:地址http://support.microsoft.com/kb/968929,在页面的中下部,找到适合自己机器操作系统的Windows Management Framework ,下载并安装。然后重启VS2010.

(如果在安装power shell2.0的时候,提示power shell不兼容错误时是因为之前机器装有PowerShell1.0.此时解决办法是打开“控制面板”的“添加删除程序”,注意:需要选中“显示更新”复选框才能看到PowerShell1.0,让后删除powershelll 1.0,再安装2.0即可)

3.新建咱们的Code First 解决方案:

File->New ->Project... 选择C# 的Console Application .命名为:EF41CodeFirstDemo

a)如果你在前面没有安装NuGet的话,可以在项目的References上右键,手动添加.NET标签下的EntityFramework引用.

b)如果你已经成功安装NuGet的话,在Packager Manager Console里面输入:install-package entityframework (注意:命令行内容不区分大小写滴,呵呵),此时NuGet到它的package库中下载并安装最新的EntityFramework.dll,手动的话,你是安装本地的EntityFramework.dll,因为前面安装过了EntityFramework RC了。

在Program.cs中添加如下代码:

Program.cs
  1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Data.Entity;
6 using System.ComponentModel.DataAnnotations;
7
8 namespace EF41CodeFirstDemo
9 {
10 class Program
11 {
12 static void Main(string[] args)
13 {
14 Random random = new Random();
15
16 using (MyContext context = new MyContext())
17 {
18 Class cl = new Class();
19 cl.ClassName = "ClassName" + random.Next();
20
21
22 Course c1 = new Course() { CourseName = "course1Name" + random.Next() };
23 Course c2 = new Course() { CourseName = "course2Name" + random.Next() };
24 Course c3 = new Course() { CourseName = "course3Name" + random.Next() };
25
26 Student student = new Student();
27 student.StudentName = "Studentname" + random.Next();
28 student.Addre = new Address {StreetNumber=111,StreetName="address"+random.Next() };
29 student.DeliverAddre = new Address { StreetNumber = 222, StreetName = "deladdress" + random.Next() };
30 student.Courses.Add(c1);
31 student.Courses.Add(c2);
32 student.Courses.Add(c3);
33
34
35
36 cl.Students.Add(student);
37
38 context.Classes.Add(cl);
39
40
41 context.SaveChanges();
42 }
43 }
44 }
45
46 public class MyContext : DbContext
47 {
48 public DbSet<Student> Students {get;set; }
49 public DbSet<Class> Classes{get;set;}
50
51 public MyContext()
52 {
53 this.Configuration.LazyLoadingEnabled = true;
54 Database.SetInitializer<MyContext>(new DropCreateDatabaseIfModelChanges<MyContext>());
55 }
56
57
58 protected override void OnModelCreating(DbModelBuilder modelBuilder)
59 {
60 base.OnModelCreating(modelBuilder);
61 //modelBuilder.Entity<Student>().ToTable("efdemo.StudentTable");
62 //modelBuilder.Entity<Student>().Property(x => x.StudentID)
63 // .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity)
64 // .IsRequired()
65 // .HasColumnName("TheStudentID");
66
67 //modelBuilder.Entity<Student>().Property(x => x.StudentName)
68 // .IsRequired()
69 // .HasMaxLength(128)
70 // .HasColumnName("TheStudentName");
71
72 //modelBuilder.Entity<Class>().ToTable("efdemo.ClassTable");
73 //modelBuilder.Entity<Class>().Property(x => x.ClassID)
74 // .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity)
75 // .IsRequired()
76 // .HasColumnName("TheClassID");
77
78 modelBuilder.ComplexType<Address>();
79 modelBuilder.Entity<Student>().Property(x=>x.Addre.StreetName).HasColumnName("StreetName").IsRequired();
80 modelBuilder.Entity<Student>().Property(x => x.Addre.StreetNumber).HasColumnName("StreetNumber").IsRequired();
81 modelBuilder.Entity<Student>().Property(x => x.DeliverAddre.StreetNumber).HasColumnName("DeliverStreeNumber");
82 modelBuilder.Entity<Student>().Property(x => x.DeliverAddre.StreetName).HasColumnName("DeliverStreetName");
83
84 modelBuilder.Entity<Student>().HasMany<Course>(x => x.Courses)
85 .WithMany(x => x.Students)
86 .Map(m =>
87 {
88 m.ToTable("StudentCourse")
89 .MapLeftKey("StuID")
90 .MapRightKey("CorID");
91
92 }
93 );
94
95 }
96 }
97
98 [Table("efdemo.AnnoStudent",Schema="ef" )]
99 public class Student
100 {
101 [Key]
102 public int StudentID { get; set; }
103
104 [Required]
105 [MaxLength(120)]
106 public string StudentName { get; set; }
107
108 public Address Addre
109 {
110 get;
111 set;
112 }
113
114 public Address DeliverAddre
115 {
116 get;
117 set;
118 }
119
120 public virtual IList<Course> Courses { get; set; }
121
122 public Student()
123 {
124 this.Courses = new List<Course>();
125 }
126 }
127
128 [Table("efdemo.AnnoClass",Schema="ef")]
129 public class Class
130 {
131 [Key]
132 [Column("AnnoClassID")]
133 [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
134 public int ClassID { get; set; }
135 public string ClassName { get; set; }
136 public IList<Student> Students { get; set; }
137
138 public Class()
139 {
140 this.Students = new List<Student>();
141 }
142 }
143
144
145 public class Address
146 {
147
148 public int StreetNumber
149 {
150 get;
151 set;
152 }
153
154
155 [StringLength(125,MinimumLength=1)]
156 public string StreetName
157 {
158 get;
159 set;
160 }
161 }
162
163 public class Course
164 {
165 [Key]
166 [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
167 public int CourseID
168 {
169 get;
170 set;
171 }
172
173 [StringLength(125,MinimumLength=1)]
174 public string CourseName { get; set; }
175
176 public virtual IList<Student> Students { get; set; }
177
178 public Course()
179 {
180 this.Students = new List<Student>();
181 }
182 }
183
184 }

上面代码中分别演示了两种方法:

一种使用Annotation。

1  [Table("efdemo.AnnoStudent",Schema="ef" )]   
2 public class Student {...}

另一种是基于方法的:

1  modelBuilder.ComplexType<Address>();       
2
3 modelBuilder.Entity<Student>().Property(x=>x.Addre.StreetName).HasColumnName("StreetName").IsRequired();

未完待续。。。。

posted @ 2012-02-02 11:50  MarkSun  阅读(5889)  评论(6编辑  收藏  举报