创建数据模型
---恢复内容开始---
使用code fist模式,得先建立数据模型,例子中先列出3个:
Student类,Enrollment类,Course类。
一个学生可以有多个课程登记,一个登记记录只对应一个学生这就是 one-to-many(一对多)关系
Course类和Enrollment也是一对多的关系

在Models文件夹中创建一个Student类
usingSystem;
usingSystem.Collections.Generic;
namespaceContosoUniversity.Models
{
publicclassStudent
{
public int StudentID{get;set;}
public string LastName{get;set;}
public string FirstMidName{get;set;}
public DateTime EnrollmentDate{get;set;}
public virtual ICollection<Enrollment>Enrollments{get;set;}
}
}
Ef默认的规则是ID或者类名加ID的该类生成的表的主键,Enrollments是个导航属性,导航到相关的对象,前面加上一个virtual属性,是为了延迟加载
usingSystem;
usingSystem.Collections.Generic;
namespace ContosoUniversity.Models
{
public class Enrollment
{
public int EnrollmentID{get;set;}
public int CourseID{get;set;}
public int StudentID{get;set;}
public decimal ? Grade{get;set;}
public virtual Course Course{get;set;} //一对多关系,不用ICollection
public virtual Student Student{get;set;}
}
}
decimal后的?表示那是个可空的属性, CourseID和StudentID是外键,对应着相应的导航属性
Course类
usingSystem;
usingSystem.Collections.Generic;
namespaceContosoUniversity.Models
{
publicclassCourse
{
public int CourseID{get;set;}
public string Title{get;set;}
public int Credits{get;set;}
public virtual ICollection<Enrollment>Enrollments{get;set;}
}
}
同理如上
下一步 创建数据库上下文
database context类是用来自动的用EF来协调一个给定的数据模型,创建一个类并从system.data.entity.dbcontext继承即可,在类中要指定包括那些对象,同时也可以自定义EF的行为。我们把它命名为SchoolContext,创建一个DAL的文件夹,并在内部创建一个SchoolContext的类,代码如下:
using System; using System.Collections.Generic; using System.Data.Entity; using ContosoUniversity.Models; using System.Data.Entity.ModelConfiguration.Conventions; namespace ContosoUniversity.Models { public class SchoolContext : DbContext { public DbSet<Student> Students { get; set; } public DbSet<Enrollment> Enrollments { get; set; } public DbSet<Course> Courses { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Conventions.Remove<PluralizingTableNameConvention>(); } } }
上面为每一个对象集如Students创建了一个Dbset(一个对象对应数据库表中一行,一个对象及对应一张表)。
后面的OnModelCreating方法是防止生成的数据库表名呈现复数状态(默认是复数),生成Student,Enrollment,Course三张表而不是Students,Enrollments,Courses.看个人代码习惯。
设置连接字符串
如果不创建一个字符串,EF会自动生成一个基于Sql Server Express的数据库连接字符串,这是我不愿看到的,所有在webconfig设置字符串
<add name="SchoolContext" connectionString="Data Source=|DataDirectory|School.sdf"
providerName="System.Data.SqlServerCe.4.0"/>
注意,这里的name一定要和数据库上下文名称一样,或者在定义SchoolContext时指定连接字符串
public class SchoolContext:DbContext
{
public SchoolContext():base("myconnectionstr")
{
}
}
<add name="myconnectionstr" connectionString="Data Source=|DataDirectory|School.sdf"
providerName="System.Data.SqlServerCe.4.0"/>
好,下面为程序添加一些初始的测试数据
EF可以在程序运行的时候自动的生成数据库,删除数据库,重新创建数据库,你可以指定EF是每次程序启动都要重新创建数据库还是只在数据模型发生改变的时候重建数据库,你还可以写一个类,里面的方法EF会在创建数据库完成后自动执行(利用它添加测试数据)。这里我指定EF只有数据模型变化时才重建数据库。
在DAL文件夹中建一个SchoolInitializer的类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data.Entity;
namespace ContosoUniversity.Models
{
public class SchoolInitializer : DropCreateDatabaseIfModelChanges<SchoolContext>
{
protected override void Seed(SchoolContext context)
{
var students = new List<Student>
{
new Student { FirstMidName = "Carson", LastName = "Alexander", EnrollmentDate = DateTime.Parse("2005-09-01") },
new Student { FirstMidName = "Meredith", LastName = "Alonso", EnrollmentDate = DateTime.Parse("2002-09-01") },
new Student { FirstMidName = "Arturo", LastName = "Anand", EnrollmentDate = DateTime.Parse("2003-09-01") },
new Student { FirstMidName = "Gytis", LastName = "Barzdukas", EnrollmentDate = DateTime.Parse("2002-09-01") },
new Student { FirstMidName = "Yan", LastName = "Li", EnrollmentDate = DateTime.Parse("2002-09-01") },
new Student { FirstMidName = "Peggy", LastName = "Justice", EnrollmentDate = DateTime.Parse("2001-09-01") },
new Student { FirstMidName = "Laura", LastName = "Norman", EnrollmentDate = DateTime.Parse("2003-09-01") },
new Student { FirstMidName = "Nino", LastName = "Olivetto", EnrollmentDate = DateTime.Parse("2005-09-01") }
};
students.ForEach(s => context.Students.Add(s));
// context.SaveChanges();
var courses = new List<Course>
{
new Course { Title = "Chemistry", Credits = 3, },
new Course { Title = "Microeconomics", Credits = 3, },
new Course { Title = "Macroeconomics", Credits = 3, },
new Course { Title = "Calculus", Credits = 4, },
new Course { Title = "Trigonometry", Credits = 4, },
new Course { Title = "Composition", Credits = 3, },
new Course { Title = "Literature", Credits = 4, }
};
courses.ForEach(s => context.Courses.Add(s));
//context.SaveChanges();
var enrollments = new List<Enrollment>
{
new Enrollment { StudentID = 1, CourseID = 1, Grade = 1 },
new Enrollment { StudentID = 1, CourseID = 2, Grade = 3 },
new Enrollment { StudentID = 1, CourseID = 3, Grade = 1 },
new Enrollment { StudentID = 2, CourseID = 4, Grade = 2 },
new Enrollment { StudentID = 2, CourseID = 5, Grade = 4 },
new Enrollment { StudentID = 2, CourseID = 6, Grade = 4 },
new Enrollment { StudentID = 3, CourseID = 1 },
new Enrollment { StudentID = 4, CourseID = 1, },
new Enrollment { StudentID = 4, CourseID = 2, Grade = 4 },
new Enrollment { StudentID = 5, CourseID = 3, Grade = 3 },
new Enrollment { StudentID = 6, CourseID = 4 },
new Enrollment { StudentID = 7, CourseID = 5, Grade = 2 },
};
enrollments.ForEach(s => context.Enrollments.Add(s));
context.SaveChanges();
}
}
}
好了运行下吧
---恢复内容结束---
浙公网安备 33010602011771号