長假歸來,祝大家:龍年吉祥,龍馬精神;福旺財旺事業旺,旺上加旺!!
差不多一個月沒登錄博客園了,呵呵。非常抱歉啦。
好了,閑言少敘,書歸正傳。呵呵。
==================================================
前面我有寫過一篇《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中添加如下代碼:

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();
未完待續。。。。