实体框架

创建学生实体

Models 文件夹中,创建 Student.cs 类,添加代码

publicint StudentID { get; set; } 
publicstring LastName { get; set; } 
publicstring FirstMidName { get; set; } 
public DateTime EnrollmentDate { get; set; } 

 创建数据库上下文

创建名为 SchoolContext 的类,派生自 System.Data.Entity.DbContext,添加代码  

publicclass SchoolContext: DbContext
{
        public SchoolContext()
            : base("DefaultConnection")
        {
        }
        public DbSet<Student> Students { get; set; }
        protectedoverridevoid OnModelCreating(DbModelBuilder modelBuilder)
         {
        base.OnModelCreating(modelBuilder);  
        }  
}

 这段代码使用 DbSet 类型的属性定义每一个实体集。在 EF 术语中,一个实体集典型地关联到一个数据库中的表,一个实体关联到表中的一行。

OnModelCreating 方法中的代码防止数据库中的表名被多元化。如果没有这样处理的话,生成的表将会被命名为 StudentsCourses Enrollments。现在,表名将会被命名为 StudentCourse Enrollment。开发者可以决定表名是否被多元化。这个教程使用单数模式,但是重要的是你可以这行代码来选择喜欢的模式。

(这个类位于 Models 命名空间,有些时候 EF 假定实体类和上下文类在相同的命名空间中)

设置连接字符串

打开项目的 web.config 文件,在 connectionStrings 配置中增加一个新的数据库连接串,如下所示,

<add name="SchoolContext" connectionString="Data Source=|DataDirectory|School.sdf" providerName="System.Data.SqlServerCe.4.0"/>

 默认情况下,EF 查找与数据库上下文类同名的数据库连接串。你现在添加的链接串将会导致在 App_Data 文件夹中创建名为 School.sdf SQL Server Compact 数据库文件。

使用测试数据初始化数据库

EF 可以在应用启动的时候,自动创建 (或者先删除再重新创建)数据库。你可以指定是在每次运行程序的时候还是在模型与数据库不一致的时候进行这个工作。你还可以指定一个 EF 在创建数据库之后可以自动调用的方法,以便填充测试数据。在这里,我们指定当模型与数据库不一致的时候删除然后重新创建数据库。

DAL 文件夹中,创建一个名为 SchoolInitializer.cs 的类,使用下面的代码替换原有的代码,使得在创建数据库之后为新的数据库填充测试数据。 

public class SchoolInitializer : DropCreateDatabaseIfModelChanges<SchoolContext>
{
    protected override void Seed(SchoolContext context)
    {
        base.Seed(context);
    }

}

 Seed 方法将数据库上下文对象作为参数,方法中的代码使用这个对象为数据库添加实体。对于每种实体类型,代码创建实体集,将它们添加到相应的 DbSet 属性中,然后在数据库中保存修改。并不需要在每一组实体之后都要调用 SaveChanges 方法,这里这么做,是当写入数据到数据库中出现问题的时候,可以比较方便地找到问题。

Global.asax.cs 中做如下的修改,使得在应用开始的时候调用初始化代码。

Application_Start 方法中,调用 EF 方法,以便运行初始化器。 

Database.SetInitializer<SchoolContext>(new SchoolInitializer());

 现在应用已经设置完成,当程序开始运行的时候,EF 将会比较数据库,如果不同的话,应用会删除然后重建数据库。

注意:当应用部署到生产环境的时候,必须删除这段代码。

现在,你可以创建一个页面来显示数据了,请求数据的处理将会自动触发创建数据库。你需要通过创建新的控制器开始。但在开始这些操作之前,先编译项目,使得对于 MVC 的脚手架来说,模型和上下文对象已经存在。

创建学生控制器

在解决方案管理其中的 Controllers 文件夹上右击,选择添加,然后点击控制器,在添加控制器的对话框中,做如下的选择,然后添加

控制器的名称为:StudentController

模板为:包含读/写操作和视图的控制器 (使用 Entity Framework)

模型类:Student (ContosoUniversity.Models) (如果没有找到,重新编译项目之后再试一下)

数据上下文类:SchoolContext (ContosoUniversity.Models)

视图:Razor(CSHTML)

打开 ControllersStudentController.cs 文件,你会看到一个类级的变量,赋予了一个数据上下文实例。

private SchoolContext db = new SchoolContext();

名为 Index Action 方法通过数据上下文对象的 Students 属性获取一个学生的列表.

public ViewResult Index()
{
  
return View(db.Students.ToList());
}

脚手架还为我们创建了一系列的 Student 视图。

现在,运行程序,点击 Student 选项卡,你就可以看到学生的列表。

关联的其他实体

student.cs最后一行添加代码

publicvirtual ICollection<Enrollment> Enrollments { get; set; }

Enrollments 属性是导航属性,导航属性用来导航到这个实体关联的其他实体。Student 类的 Enrollments 属性用来持有这个学生关联的所有注册实体。或者说,如果在数据库中,一个学生行有两个关联的注册行(通过 StudentId 这个外键关联到学生表),学生实体的注册属性将会包含包含两个注册实体。

导航属性典型地被定义为虚拟的 virtual,以便通过 EF 名为延迟加载的功能来获得好处,(延迟加载将在后面进行说明),如果导航属性可以持有多个实体,(在多对多情况下,或者一对多情况下),类型必须为 ICollection

注册实体

Models 文件夹中,创建 Enrollment.cs 文件,添加如下代码:  

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; }  
public virtual Student Student { get; set; }

decimal 类型后面的 ? 表示成绩 (Grade) 是可空的。成绩是空的不同于 0,空意味着还没有成绩,0 意味着成绩为 0

StudentID 属性是外键,关联的导航属性为 Student。一个 Enrollment 关联一个 Student,所以这个属性只能持有一个 Student 实体 (不像 Student.Enrollments 导航属性)

CourseID 属性也是外键,关联的导航属性为 Course,一个 Enrollment 关联一个 Course 实体。

课程实体

Models 文件夹中,创建 Course.cs 代码文件,添加代码 

public int CourseID { get; set; }  
public string Title { get; set; }  
public int Credits { get; set; }  
public virtual ICollection<Enrollment> Enrollments { get; set; } 

Enrollments 属性是导航属性,一个 Course 实体可以关联多个注册实体。

创建课程控制器

模型类:Course (ContosoUniversity.Models),其它和创建学生控制器相同,

创建成绩控制器

模型类:Enrollment (ContosoUniversity.Models),其它和创建学生控制器相同,


原文地址:https://www.cnblogs.com/gobuild/p/4905533.html