实体框架 - 模型优先方法


在本章中,让我们学习如何使用称为模型优先的工作流程在设计器中创建实体数据模型。

  • 当您开始一个数据库甚至还不存在的新项目时,模型优先非常有用。

  • 该模型存储在 EDMX 文件中,可以在实体框架设计器中查看和编辑。

  • 在模型优先中,您在实体框架设计器中定义模型,然后生成 SQL,这将创建与您的模型匹配的数据库架构,然后执行 SQL 以在数据库中创建架构。

  • 您在应用程序中与之交互的类是从 EDMX 文件自动生成的。

以下是使用模型优先方法创建新控制台项目的简单示例。

步骤 1 - 打开 Visual Studio 并选择文件 → 新建 → 项目

控制台项目

步骤 2 - 从左侧窗格中选择“已安装”→“模板”→“Visual C#”→“Windows”,然后在中间窗格中选择“控制台应用程序”。

步骤 3 - 在名称字段中输入 EFModelFirstDemo。

步骤 4 - 要创建模型,首先右键单击解决方案资源管理器中的控制台项目,然后选择添加→新项目...

模型

将打开以下对话框。

添新

步骤 5 - 从中​​间窗格中选择 ADO.NET 实体数据模型,然后在名称字段中输入名称 ModelFirstDemoDB。

步骤 6 - 单击“添加”按钮,这将启动“实体数据模型向导”对话框。

模型向导对话框

步骤 7 - 选择空 EF 设计器模型并单击下一步按钮。实体框架设计器将打开并显示一个空白模型。现在我们可以开始向模型添加实体、属性和关联。

步骤 8 - 右键单击​​设计图面并选择属性。在“属性”窗口中,将实体容器名称更改为 ModelFirstDemoDBContext。

设计表面

步骤 9 - 右键单击​​设计图面并选择添加新→实体...

添加新实体

添加实体对话框将打开,如下图所示。

实体对话框

步骤 10 - 输入 Student 作为实体名称,输入 Student Id 作为属性名称,然后单击“确定”。

学生

步骤 11 - 右键单击​​设计图面上的新实体,然后选择添加新→标量属性,输入名称作为属性的名称。

新实体

步骤 12 - 输入 FirstName,然后添加另外两个标量属性,例如 LastName 和 EnrollmentDate。

标量属性

步骤 13 - 按照上述所有步骤添加另外两个实体课程和注册,并添加一些标量属性,如以下步骤所示。

视觉设计师

步骤 14 - 我们在视觉设计器中有三个实体,让我们在它们之间添加一些关联或关系。

步骤 15 - 右键单击​​设计图面并选择添加新→关联...

添加协会

步骤 16 - 使关系的一端指向具有一个重数的“学生”,另一端指向具有多个重数的“注册”。

一的重数

步骤 17 - 这意味着一个学生有多个注册,并且注册属于一个学生。

步骤 18 - 确保选中“将外键属性添加到“发布”实体”框,然后单击“确定”。

步骤 19 - 同样,在课程和注册之间添加一个关联。

课程及报名

步骤 20 - 添加实体之间的关联后,您的数据模型将如下所示。

数据模型

现在我们有了一个简单的模型,可以从中生成数据库并用于读取和写入数据。让我们继续生成数据库。

步骤 1 - 右键单击​​设计图面并选择从模型生成数据库...

来自模型的数据库

步骤 2 - 您可以选择现有数据库或通过单击“新建连接”创建新连接...

生成数据库

步骤 3 - 要创建新数据库,请单击“新建连接...”

连接属性

步骤 4 - 输入服务器名称和数据库名称。

服务器和数据库

步骤 5 - 单击“下一步”。

服务器和数据库1

步骤 6 - 单击完成。这将在项目中添加 *.edmx.sql 文件。您可以通过打开 .sql 文件,然后右键单击并选择“执行”,在 Visual Studio 中执行 DDL 脚本。

DDL 脚本

步骤 7 - 将显示以下对话框以连接到数据库。

连接到数据库

步骤 8 - 成功执行后,您将看到以下消息。

成功执行

步骤 9 - 转到服务器资源管理器,您将看到数据库是使用指定的三个表创建的。

数据库已创建

接下来,我们需要交换模型以生成使用 DbContext API 的代码。

步骤 1 - 右键单击​​ EF 设计器中模型的空白位置,然后选择添加代码生成项...

EF 设计师

您将看到以下“添加新项目”对话框打开。

对话框打开

步骤 2 - 在中间窗格中选择 EF 6.x DbContext Generator,然后在“名称”字段中输入 ModelFirstDemoModel。

步骤 3 - 您将在解决方案资源管理器中看到已生成 ModelFirstDemoModel.Context.tt 和 ModelFirstDemoModel.tt 模板。

模板生成

ModelFirstDemoModel.Context 生成 DbCcontext 和对象集,您可以返回并使用它们进行查询,例如上下文、学生和课程等。

另一个模板处理所有类型的学生、课程等。以下是学生类,它是从实体模型自动生成的。

CSharp代码

以下是 C# 代码,其中输入一些数据并从数据库检索一些数据。

using System;
using System.Linq;

namespace EFModelFirstDemo {

   class Program {

      static void Main(string[] args) {

         using (var db = new ModelFirstDemoDBContext()) {

            // Create and save a new Student

            Console.Write("Enter a name for a new Student: ");
            var firstName = Console.ReadLine();

            var student = new Student {
               StudentID = 1,
               FirstName = firstName
            };
				
            db.Students.Add(student);
            db.SaveChanges();
				
            var query = from b in db.Students
               orderby b.FirstName select b;

            Console.WriteLine("All student in the database:");

            foreach (var item in query) {
               Console.WriteLine(item.FirstName);
            }

            Console.WriteLine("Press any key to exit...");
            Console.ReadKey();
         }
      }
   }
}

执行上述代码时,您将收到以下输出 -

Enter a name for a new Student:
Ali Khan
All student in the database:
Ali Khan
Press any key to exit...

我们建议您逐步执行上述示例,以便更好地理解。