创建实体框架数据模型,的一些体会

真觉得自己的知识面还是比较窄,在此之前,居然还不知道SqlLocalDb。

Contoso University  Web 应用程序

你会在这些教程中构建的应用程序是一个简单的大学网站。

用户可以查看和更新学生、
课程和教师信息。这里有几个屏幕,您将创建。

图片 1 

图片 2

这个网站的用户界面样式一直接近由内置的模板,生成的内容,以便本教程可以集中主要精力如何使用实体框架。

SqlLocalDb是啥?其实就是简化SQL Server的本地数据库,可以这样子说,SQL
Server既可以作为远程,也可以做本地,

系统必备组件

方向和屏幕截图在本教程中假定您正在使用Visual Studio
2012或Visual
Studio 2012
速成网站,最新的更新与截至
2013 年 7 月,安装的 Windows Azure SDK。你可以得到这一切与下面的链接:

Windows Azure SDK 以 Visual Studio
2012

如果你有安装了 Visual
Studio,上面的链接将安装任何缺少的组件。如果你没有 Visual Studio,该链接将安装 Visual Studio 2012
速成网站。您可以使用 Visual Studio 2013
年,但某些所需的程序和屏幕会有所不同。

而SqlLocalDb只能作为本地使用。说的直接一点,SqlLocalDb就是一个轻量级的基于本地的T-SQL数据库,全称:SQL
Server Express LocalDb。

创建 MVC Web 应用程序

打开 Visual Studio 并创建一个新 C#
项目命名为”ContosoUniversity”使用ASP.NET MVC 4 Web
应用程序
模板。请确保您的目标.NET 框架
4.5
 (你会使用enum的属性,并且,需要.NET
4.5)。

图片 3

新的 ASP.NET MVC 4 项目对话框中选择的互联网应用模板。

Razor视图引擎选择,和创建一个单元测试项目的复选框处于清除状态的假期。

单击确定.

图片 4

好,废话不多说。

建立了该网站的风格

几个简单的改变将设立网站菜单、 布局和主页。

打开Views\Shared\_Layout.cshtml,然后用以下代码替换该文件的内容。突出显示所做的更改。

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8" />
        <title>@ViewBag.Title - Contoso University</title>
        <link href="~/favicon.ico" rel="shortcut icon" type="image/x-icon" />
        <meta name="viewport" content="width=device-width" />
        @Styles.Render("~/Content/css")
        @Scripts.Render("~/bundles/modernizr")
    </head>
    <body>
        <header>
            <div class="content-wrapper">
                <div class="float-left">
                    <p class="site-title">@Html.ActionLink("Contoso University", "Index", "Home")</p>
                </div>
                <div class="float-right">
                    <section id="login">
                        @Html.Partial("_LoginPartial")
                    </section>
                    <nav>
                        <ul id="menu">
                            <li>@Html.ActionLink("Home", "Index", "Home")</li>
                            <li>@Html.ActionLink("About", "About", "Home")</li>
                            <li>@Html.ActionLink("Students", "Index", "Student")</li>
                            <li>@Html.ActionLink("Courses", "Index", "Course")</li>
                            <li>@Html.ActionLink("Instructors", "Index", "Instructor")</li>
                            <li>@Html.ActionLink("Departments", "Index", "Department")</li>
                        </ul>
                    </nav>
                </div>
            </div>
        </header>
        <div id="body">
            @RenderSection("featured", required: false)
            <section class="content-wrapper main-content clear-fix">
                @RenderBody()
            </section>
        </div>
        <footer>
            <div class="content-wrapper">
                <div class="float-left">
                    <p>&copy; @DateTime.Now.Year - Contoso University</p>
                </div>
            </div>
        </footer>

        @Scripts.Render("~/bundles/jquery")
        @RenderSection("scripts", required: false)
    </body>
</html>

这段代码进行以下更改:

  • “我的 ASP.NET MVC
    应用程序”和”您的徽标在这里”的模板实例替换为”Contoso University”。
  • 添加将使用在本教程后面的几个操作环节。

Views\Home\Index.cshtml,用以下代码,以消除有关 ASP.NET 和 MVC
模板段落替换该文件的内容:

@{
    ViewBag.Title = "Home Page";
}
@section featured {
    <section class="featured">
        <div class="content-wrapper">
            <hgroup class="title">
                <h1>@ViewBag.Title.</h1>
                <h2>@ViewBag.Message</h2>
            </hgroup>
        </div>
    </section>
}

Controllers\HomeController.cs,将值更改为ViewBag.Message Index操作方法中为”欢迎来到
Contoso 大学 !”,如下面的示例所示:

public ActionResult Index()
{
    ViewBag.Message = "Welcome to Contoso University";

    return View();
}

按 CTRL + F5 以运行网站。你看到主页与主菜单。

图片 5

第一,怎么安装这个SqlLocalDb?

创建数据模型

接下来,您将创建实体类为 Contoso
University 中的应用。你将开始与以下三个实体:

图片 6

还有StudentEnrollment实体之间的一个一对多关系和CourseEnrollment实体之间是一对多的关系。换句话说,学生可以在任意数量的课程,并当然可以有任意数量的学生参加了它。

在以下部分中,您将创建一个类,用于每个这些实体。

如果您尝试编译该项目,在您完成所有这些实体类的创建之前,你就会得到编译器错误。

1)如果安装过Visual Studio 2015、2017,一般已经安装到了电脑里。

学生实体

图片 7

模型文件夹中,创建Student.cs和现有代码替换为以下代码:

using System;
using System.Collections.Generic;

namespace ContosoUniversity.Models
{
    public class Student
    {
        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; }
    }
}

StudentID属性将成为此类对应的数据库表的主键列。默认情况下,实体框架将解释是命名的ID类名ID作为主键的属性。

Enrollments属性是一个导航属性。导航属性持有此实体相关的其他实体。在这种情况下,一个Student实体的Enrollments属性将保留所有的Enrollment实体的那个Student实体相关的。换言之,如果某一给定的Student行在数据库中有两个相关的Enrollment
(包含在其StudentID的外键列中的那个学生主键值的行),该Student实体Enrollments导航属性将包含这两个Enrollment实体。

导航属性通常定义为virtual中,以便他们可以利用某些实体框架功能,如延迟加载。(延迟加载将稍后解释,读取相关数据教程稍后在本系列中。

如果一个导航属性可以容纳多个实体
(如多多或一个一对多关系),其类型必须是一个列表条目可以被添加、
删除和更新,如ICollection.

     这里以Visual Studio 2017为例,在Visual Studio
Installer中的单个组件页面中,可以看到该组件已经被安装(红色框框部分):

注册实体

图片 8

模型文件夹中,创建Enrollment.cs和现有代码替换为以下代码:

namespace ContosoUniversity.Models
{
    public enum Grade
    {
        A, B, C, D, F
    }

    public class Enrollment
    {
        public int EnrollmentID { get; set; }
        public int CourseID { get; set; }
        public int StudentID { get; set; }
        public Grade? Grade { get; set; }

        public virtual Course Course { get; set; }
        public virtual Student Student { get; set; }
    }
}

等级属性是枚举。问号后Grade类型声明指示Grade属性是可以为
null。为 null 的品位是不同于零级 — — null
意味着等级不为人知或没有被指派。

StudentID属性是一个外键,且相应的导航属性是StudentEnrollment实体是与一个Student实体相关联,所以该属性只能容纳一个单一的Student实体
(不像Student.Enrollments导航属性你前面所述,而数组可以存放多个Enrollment实体)。

CourseID属性是一个外键,且相应的导航属性CourseEnrollment实体是与一个Course实体相关联。

 
  图片 9

课程实体

图片 10

模型文件夹中,创建Course.cs,现有代码替换为以下代码:

using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;

namespace ContosoUniversity.Models
{
    public class Course
    {
        [DatabaseGenerated(DatabaseGeneratedOption.None)]
        public int CourseID { get; set; }
        public string Title { get; set; }
        public int Credits { get; set; }

        public virtual ICollection<Enrollment> Enrollments { get; set; }
    }
}

Enrollments属性是一个导航属性。Course实体可以与任意数量的Enrollment实体。

我们会说更多关于[DatabaseGenerated(DatabaseGeneratedOption.None)]在接下来的教程中的属性。基本上,此属性允许您为该课程而不是生成的数据库输入的主键。

2)或者到Visual Studio 2017安装包安装该组件:

创建Database Context

坐标给定的数据模型的实体框架功能的主类是数据库上下文类。通过从System.Data.Entity.DbContext.aspx)类派生来创建此类。在您的代码中您指定数据模型中包括哪些实体。您还可以自定义某些实体框架行为。在这个项目中,类名为SchoolContext.

创建一个文件夹命名DAL (为数据访问层)。在该文件夹中创建一个新的类文件,命名为SchoolContext.cs,和现有的代码替换为以下代码:

using ContosoUniversity.Models;
using System.Data.Entity;
using System.Data.Entity.ModelConfiguration.Conventions;

namespace ContosoUniversity.DAL
{
    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>();
        }
    }
}

此代码创建一个DbSet.aspx)属性为每个实体集。在实体框架术语中,实体集通常对应于数据库表,和一个实体对应于表中的一行。

OnModelCreating.aspx)方法中的modelBuilder.Conventions.Remove语句可以防止表名称正在趋向多元化。如果你不这样做,所生成的表将命名为StudentsCoursesEnrollments。相反,表名称将是StudentCourse
Enrollment。表名称应该多数开发商不同意。本教程使用的是单数形式,但重要的一点是您可以选择哪个你更喜欢通过包括或省略下面这行代码的形式。

     64位:

SQL 服务器快递 LocalDB

LocalDB是一个轻量级版本
SQL Server 表示数据库引擎的按需启动和运行在用户模式下。LocalDB 运行的 SQL Server Express
使您能够使用数据库的.mdf文件作为特殊的执行方式。通常情况下,LocalDB 数据库文件保存在 web
项目的App_Data文件夹中。在 SQL Server
Express用户实例功能还使您能够使用.mdf文件,但不推荐使用用户实例的功能
;因此,LocalDB
被推荐使用的.mdf文件。

通常 SQL Server Express 的并不用于生产的 web
应用程序。LocalDB 尤其不推荐用于生产一个 web
应用程序因为它不设计工作的非法入境者。

在 Visual Studio 2012
及以后的版本中,默认情况下,Visual Studio 安装 LocalDB。在 Visual Studio 2010 及更早版本中,在默认情况下,Visual
Studio ; 安装 SQL Server Express (无 LocalDB)您必须手动安装它,如果你使用的 Visual Studio 2010。

在本教程中您将使用
LocalDB,以便数据库可以存储在.mdf文件所在的App_Data文件夹中。打开根Web.config文件并到connectionStrings集合中,添加一个新的连接字符串,如下面的示例所示。(请确保您更新Web.config文件中的根项目文件夹。此外,还有 Web.config文件是您不需要更新的视图子文件夹中。)

 <add name="SchoolContext" connectionString="Data Source=(LocalDb)\v11.0;Initial Catalog=ContosoUniversity;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\ContosoUniversity.mdf" providerName="System.Data.SqlClient" />

默认情况下,实体框架查找名为DbContext
(此项目SchoolContext ) 相同的连接字符串。您已经添加的连接字符串指定一个名为ContosoUniversity.mdf位于App_Data文件夹中的
LocalDB 数据库。更多的信息,请参见ASP.NET
Web 应用程序的 SQL
服务器连接字符串.

实际上,您不需要指定的连接字符串。如果您不提供连接字符串,实体框架将创建一个为您
;但是,数据库可能无法在您的应用程序的App_data文件夹中。将创建数据库的信息,请参见代码第一次到新的数据库.

connectionStrings集合还具有一个名为DefaultConnection的用于成员资格数据库的连接字符串。在本教程中,您不会使用成员资格数据库。两个连接字符串之间的唯一区别是数据库名称和名称属性值。

   
 图片 11

设置和执行代码第一次迁移

当你第一次开始开发应用程序时,您的数据模型更改频繁,而且每次获取与数据库不同步的模型更改。您可以配置实体框架可以自动删除并重新创建该数据库的每次更改数据模型。这不是一个问题在开发的早期,因为测试数据是很容易重新创建,但是您已经部署到生产后你通常想要更新数据库架构,而不删除数据库。迁移功能使代码第一要更新数据库,而不会删除并重新创建它。早在开发周期中的一个新的项目你可能想要使用DropCreateDatabaseIfModelChanges.aspx) ,可以删除、
重新创建和重新设置为种子数据库每次模型更改。一个人,你准备部署您的应用程序,您可以转换为的迁移方法。在本教程中,您将仅使用迁移。有关的详细信息,请参见代码第一次迁移和迁移截屏视频系列.

    32位:

启用代码第一次迁移

  1. 工具菜单上,单击库程序包管理器,然后程序包管理器控制台.

    图片 12

  2. PM>提示符下输入以下命令:

    enable-migrations -contexttypename SchoolContext
    

    图片 13

    此命令在 ContosoUniversity
    项目中,创建一个迁移文件夹和它在该文件夹中放一个Configuration.cs文件,您可以编辑配置迁移。

    图片 14

    Configuration类包括创建数据库时,每次更新数据模型更改后调用的Seed方法。

    internal sealed class Configuration : DbMigrationsConfiguration<ContosoUniversity.Models.SchoolContext>
    {
        public Configuration()
        {
            AutomaticMigrationsEnabled = false;
        }
    
        protected override void Seed(ContosoUniversity.Models.SchoolContext context)
        {
            //  This method will be called after migrating to the latest version.
    
            //  You can use the DbSet<T>.AddOrUpdate() helper extension method 
            //  to avoid creating duplicate seed data. E.g.
            //
            //    context.People.AddOrUpdate(
            //      p => p.FullName,
            //      new Person { FullName = "Andrew Peters" },
            //      new Person { FullName = "Brice Lambson" },
            //      new Person { FullName = "Rowan Miller" }
            //    );
            //
        }
    }
    

    Seed方法的目的是使您能够向数据库中插入测试数据后代码第一次创建或更新它。

 
  图片 15

建立了种子法

种子.aspx)方法运行时代码第一次迁移创建数据库和每一次它将更新到最新的迁移数据库。种子法的目的是为了使您能够将数据插入到表之前应用程序访问数据库第一次。

在早期版本的代码优先,迁移被释放之前,它是平常的Seed方法来插入测试数据,因为在开发过程中的每个模型修改数据库不得不被完全删除和重新创建从零开始。与代码第一次迁移,测试数据保留后数据库更改,因此包括种子.aspx)方法中的测试数据通常不是必需。事实上,你不想要插入测试数据,如果您将使用迁移将数据库部署到生产,因为Seed方法将运行在生产中的Seed方法。在这种情况下你希望Seed方法向数据库中插入你想要在生产中插入的数据。例如,您可能想要包括实际部门名称Department表中,当应用程序在生产中可用的数据库。

对于本教程,您将使用迁移的部署,但你的Seed方法将插入测试数据无论如何为了使它更加轻松地查看应用程序的功能而无需手动插入大量的数据的工作。

  1. Configuration.cs文件的内容替换为以下代码中,将测试数据加载到新的数据库。

    namespace ContosoUniversity.Migrations
    {
       using System;
       using System.Collections.Generic;
       using System.Data.Entity.Migrations;
       using System.Linq;
       using ContosoUniversity.Models;
    
       internal sealed class Configuration : DbMigrationsConfiguration<ContosoUniversity.DAL.SchoolContext>
       {
          public Configuration()
          {
             AutomaticMigrationsEnabled = false;
          }
    
          protected override void Seed(ContosoUniversity.DAL.SchoolContext context)
          {
             var students = new List<Student>
                {
                    new Student { FirstMidName = "Carson",   LastName = "Alexander", 
                        EnrollmentDate = DateTime.Parse("2010-09-01") },
                    new Student { FirstMidName = "Meredith", LastName = "Alonso",    
                        EnrollmentDate = DateTime.Parse("2012-09-01") },
                    new Student { FirstMidName = "Arturo",   LastName = "Anand",     
                        EnrollmentDate = DateTime.Parse("2013-09-01") },
                    new Student { FirstMidName = "Gytis",    LastName = "Barzdukas", 
                        EnrollmentDate = DateTime.Parse("2012-09-01"
    

3)到SQL
Server下载中心下载SQL
Server
Express:

下载之后,打开该引用,并点击“下载介质”:

图片 16

在弹出的页面中,选择LocalDB(第三个),点击下一步下载SqlLocalDB.msi

图片 17

注:SQL Server 2016 Express
LocalDB微软已经不再提供,目前为最新的,也就是以上的2017版本。

4)百度网盘下载:

图片 18

图片 19

根据系统类型安装不同的SqlLocalDB。

第二、连接SqlLocalDB

1、打开Visual Studio
2017,依次点击“视图”(菜单栏)->“服务器资源管理器”,将会打开“服务器资源管理器”窗口:

图片 20

2、右键点击“数据连接”,在弹出的上下文菜单中选择“添加连接”,在弹出的窗口中将“服务器名”设置为(LocalDb)\MSSQLLocalDB,如下图所示:

图片 21

然后附加一个名称为MusicDBContext.mdf的数据库文件(文件可以自己定义)并点击确定,此时,MusicDBContext.数据库作为默认的数据库,我们可以选择SQLLocalDB中的其他已有数据库。

生成的连接字符串如下:

Data Source=(LocalDb)\MSSQLLocalDB;AttachDbFilename=C:\Users\CNC\Desktop\MusicDBContext.mdf;Initial Catalog=MusicDBContext;Integrated Security=True

我们可以将mdf文件的路径改为相对路径:

Data Source=(LocalDb)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\MusicDBContext.mdf;Initial Catalog=MusicDBContext;Integrated Security=True

第三,编写程序对已有数据的读取

如下代码所示:

using System;
using System.Data;
using System.Data.SqlClient;
using System.Linq;

namespace ConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            string connectionString = @"Data Source=(LocalDb)\MSSQLLocalDB;Initial Catalog=MusicDBContext;Integrated Security=True";
            SqlConnection connection = new SqlConnection(connectionString);
            SqlDataAdapter adapter = new SqlDataAdapter("SELECT * FROM Musics",connection);
            DataTable table = new DataTable();
            adapter.Fill(table);
            var result = (from row 
                          in table.Rows.Cast<DataRow>()
                          select
                          new { ID = (int)row[0], Title = (string)row[1], ReleaseDate = (DateTime)row[2] });
            result.ToList().ForEach(x => Console.WriteLine($"{x.ID},{x.Title},{x.ReleaseDate}"));
        }
    }
}

运行结果如下:

图片 22

 
注:MusicDBContext.mdf可以在百度网盘下载,地址:

第四、一些关于SqlLocalDB的参考资料

 

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*
*
Website