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中添加如下代码:
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();