您的位置:首页 > 其它

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

2012-11-22 00:47 330 查看
长假归来,祝大家:龙年吉祥,龙马精神;福旺财旺事业旺,旺上加旺!!

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

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

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

前面我有写过一篇《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了)

Program.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Entity;
using System.ComponentModel.DataAnnotations;

namespace EF41CodeFirstDemo
{
class Program
{
static void Main(string[] args)
{
Random random = new Random();

using (MyContext context = new MyContext())
{
Class cl = new Class();
cl.ClassName = "ClassName" + random.Next();

Course c1 = new Course() { CourseName = "course1Name" + random.Next() };
Course c2 = new Course() { CourseName = "course2Name" + random.Next() };
Course c3 = new Course() { CourseName = "course3Name" + random.Next() };

Student student = new Student();
student.StudentName = "Studentname" + random.Next();
student.Addre = new Address {StreetNumber=111,StreetName="address"+random.Next() };
student.DeliverAddre = new Address { StreetNumber = 222, StreetName = "deladdress" + random.Next() };
student.Courses.Add(c1);
student.Courses.Add(c2);
student.Courses.Add(c3);

cl.Students.Add(student);

context.Classes.Add(cl);

context.SaveChanges();
}
}
}

public class MyContext : DbContext
{
public DbSet<Student> Students {get;set; }
public DbSet<Class> Classes{get;set;}

public MyContext()
{
this.Configuration.LazyLoadingEnabled = true;
Database.SetInitializer<MyContext>(new DropCreateDatabaseIfModelChanges<MyContext>());
}

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
//modelBuilder.Entity<Student>().ToTable("efdemo.StudentTable");
//modelBuilder.Entity<Student>().Property(x => x.StudentID)
//    .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity)
//    .IsRequired()
//    .HasColumnName("TheStudentID");

//modelBuilder.Entity<Student>().Property(x => x.StudentName)
//    .IsRequired()
//    .HasMaxLength(128)
//    .HasColumnName("TheStudentName");

//modelBuilder.Entity<Class>().ToTable("efdemo.ClassTable");
//modelBuilder.Entity<Class>().Property(x => x.ClassID)
//    .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity)
//    .IsRequired()
//    .HasColumnName("TheClassID");

modelBuilder.ComplexType<Address>();
modelBuilder.Entity<Student>().Property(x=>x.Addre.StreetName).HasColumnName("StreetName").IsRequired();
modelBuilder.Entity<Student>().Property(x => x.Addre.StreetNumber).HasColumnName("StreetNumber").IsRequired();
modelBuilder.Entity<Student>().Property(x => x.DeliverAddre.StreetNumber).HasColumnName("DeliverStreeNumber");
modelBuilder.Entity<Student>().Property(x => x.DeliverAddre.StreetName).HasColumnName("DeliverStreetName");

modelBuilder.Entity<Student>().HasMany<Course>(x => x.Courses)
.WithMany(x => x.Students)
.Map(m =>
{
m.ToTable("StudentCourse")
.MapLeftKey("StuID")
.MapRightKey("CorID");

}
);

}
}

[Table("efdemo.AnnoStudent",Schema="ef" )]
public class Student
{
[Key]
public int StudentID { get; set; }

[Required]
[MaxLength(120)]
public string StudentName { get; set; }

public Address Addre
{
get;
set;
}

public Address DeliverAddre
{
get;
set;
}

public virtual IList<Course> Courses { get; set; }

public Student()
{
this.Courses = new List<Course>();
}
}

[Table("efdemo.AnnoClass",Schema="ef")]
public class Class
{
[Key]
[Column("AnnoClassID")]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int ClassID { get; set; }
public string ClassName { get; set; }
public IList<Student> Students { get; set; }

public Class()
{
this.Students = new List<Student>();
}
}

public class Address
{

public int StreetNumber
{
get;
set;
}

[StringLength(125,MinimumLength=1)]
public string StreetName
{
get;
set;
}
}

public class Course
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int CourseID
{
get;
set;
}

[StringLength(125,MinimumLength=1)]
public string CourseName { get; set; }

public virtual IList<Student> Students { get; set; }

public Course()
{
this.Students = new List<Student>();
}
}

}


上面代码中分别演示了两种方法:
一种使用Annotation。

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


另一种是基于方法的:

modelBuilder.ComplexType<Address>();

modelBuilder.Entity<Student>().Property(x=>x.Addre.StreetName).HasColumnName("StreetName").IsRequired();


未完待续。。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: