Entity Framework代码优先(Code First)模式

下面是Entity Framework代码优先(Code First)模式的完整攻略,包括定义数据模型、创建数据库、数据存取操作等内容。

什么是代码优先(Code First)模式

Entity Framework是微软推出的一个ORM(对象关系映射)框架,用于简化应用程序与数据库之间的访问。Entity Framework有三种模式:数据库优先(DataBase First)、模型优先(Model First)和代码优先(Code First)。

数据库优先的做法是先设计好数据库表结构,然后通过Entity Framework去生成相应的数据模型;模型优先就是通过给定模型(EDMX)去创建对应的数据表。而代码优先就是通过写代码定义数据模型,然后再通过EF去创建相应的数据库表结构。

相较于其他模式,代码优先具有以下优势:

  1. 代码优先可以方便快捷地定义实体类和关系,很好地支持敏捷开发等前端代码开发模式。
  2. 实体数据的模型完全独立于数据库,只需通过API方法即可轻松实现数据库的操作和管理,使工作更加方便、高效。
  3. 因为使用了代码优先,开发人员将与实体模型直接打交道,而不必关注数据库底层结构,也可以通过反向工程来生成代码库,减少手工工作量。

如何使用代码优先模式

使用代码优先需要遵循以下步骤:

1. 定义数据模型

使用代码优先就是先使用 POCO(Plain Old CLR Object),通过定义实体类和DbContext来确定数据模型与关系。实体类就是代表一个数据库表的类,而DbContext则是代表整个数据库。在定义实体类时,需要指定它们如何映射到数据库,例如:

public class MyEntity
{
    public int Id { get; set; }
    public string Name { get; set; }
}

2. 创建数据库

在定义好实体类和上下文(DbContext)后,需要在应用程序启动时创建数据库。该操作称为“代码第一次迁移”。

在 Visual Studio 中打开如下命令行窗口:

PM> enable-migrations

执行上面的命令之后,一个 Migrations 文件夹将会自动创建。

此时,可以执行如下命令来创建数据库:

PM> update-database

此时,如果之前没有定义过数据库,则会创建一个新的数据库。如果定义过,则会更新已经存在的数据库。如果修改了字段等模型的定义,则需要再次执行update-database。

3. 数据存取操作

在 DbContext 中可以定义 DbSet 属性,它表示可以查询的实体集合。可以使用调用 DbSet 的 LINQ 查询来进行各种数据操作,例如:

public class MyDbContext : DbContext
{
    public MyDbContext(string connectionString) : base(connectionString)
    {
    }

    public DbSet<MyEntity> MyEntities { get; set; }
}

// 在其他代码中
using (var context = new MyDbContext(connectionString)) {
    // 添加一个 MyEntity 实例
    var entity = new MyEntity() { Name = "My Entity" };
    context.MyEntities.Add(entity);

    // 提交数据修改
    context.SaveChanges();
}

两个示例说明

下面,我将通过两个示例来说明如何在代码优先模式下操作数据库。

示例1:创建用户表

public class User
{
    [Key] // 主键自增长
    public int Id { get; set; }

    [Required] // 不允许空值
    public string Name { get; set; }

    [EmailAddress] // 只允许电子邮件格式
    public string Email { get; set; }
}

// DbContext
public class MyDbContext : DbContext
{
    public MyDbContext(string connectionString) : base(connectionString) { }

    public DbSet<User> Users { get; set; }
}

定义好了User类和MyDbContext这个上下文对象之后,我们就可以通过一些方法增删查改User对象了

using (var context = new MyDbContext("your connection string")) {
    // 添加一个用户
    var user = new User { Name = "Demo", Email = "demo@example.com" };
    context.Users.Add(user);
    context.SaveChanges();

    // 查询所有用户
    var users = context.Users.ToList();

    // 修改用户信息
    user.Name = "Updated Name";
    user.Email = "Updated Email";
    context.SaveChanges();

    // 删除一个用户
    context.Users.Remove(user);
    context.SaveChanges();
}

示例2: 创建多个表并设置外键关系

// 创建一个课程数据模型
public class Course
{
    [Key]
    public int Id { get; set; }

    [Required]
    public string Name { get; set; }

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

// 创建一个学生数据模型
public class Student
{
    [Key]
    public int Id { get; set; }

    [Required]
    public string Name { get; set; }

    [EmailAddress]
    public string Email { get; set; }

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

// 录取数据模型
public class Enrollment
{
    [Key]
    public int Id { get; set; }

    [Required]
    public int StudentId { get; set; }

    [Required]
    public int CourseId { get; set; }

    [ForeignKey("StudentId")]
    public virtual Student Student { get; set; }

    [ForeignKey("CourseId")]
    public virtual Course Course { get; set; }

    public int Score { get; set; }
}

// DbContext
public class MyDbContext : DbContext
{
    public MyDbContext(string connectionString) : base(connectionString) { }

    public DbSet<Student> Students { get; set; }
    public DbSet<Course> Courses { get; set; }
    public DbSet<Enrollment> Enrollments { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        // 配置外键关系
        modelBuilder.Entity<Enrollment>()
            .HasRequired(e => e.Student)
            .WithMany(s => s.Enrollments)
            .HasForeignKey(e => e.StudentId);

        modelBuilder.Entity<Enrollment>()
            .HasRequired(e => e.Course)
            .WithMany(c => c.Enrollments)
            .HasForeignKey(e => e.CourseId);
    }
}

上面代码定义了三个数据模型,Student 和 Course 实体类表示学生和课程,Enrollment 实体类表示学生选修课程,Enrollment 中的StudentId 和CourseId 为外键,指向Student 和Course 实体类中的Id。

在 DbContext 中,我们可以定义 DbSet 属性,表示要操作的实体集合。一个实体类通常需要映射到一个表中,这里Student 实体类映射到Students表中,Course 实体类映射到Course表中,Enrollment 实体类映射到Enrollments表中。

当Enrollment 实体类映射到数据库表结构中时,需要在 DbContext 中配置外键关系,这个配置使用OnModelCreating方法执行。

然后我们就可以通过一些方法增删查改User 对象:

using (var context = new MyDbContext("your connection string")) {
    // 创建一个课程
    var course = new Course { Name = "Mathematics" };
    context.Courses.Add(course);
    context.SaveChanges();

    // 创建一个学生
    var student = new Student { Name = "Bob", Email = "bob@example.com" };
    context.Students.Add(student);
    context.SaveChanges();

    // 建立学生和课程之间的联系
    var enrollment = new Enrollment { CourseId = course.Id, StudentId = student.Id };
    context.Enrollments.Add(enrollment);
    context.SaveChanges();

    // 查询选修这门课程的所有学生
    var studentsInCourse = course.Enrollments.Select(e => e.Student).ToList();

    // 查询Bob选修的所有课程
    var bobsEnrollments = student.Enrollments.Select(e => e.Course).ToList();
}

以上就是两个示例,说明如何使用代码优先模式创建数据库表,定义关系以及进行数据库操作。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Entity Framework代码优先(Code First)模式 - Python技术站

(0)
上一篇 2023年6月3日
下一篇 2023年6月3日

相关文章

  • C#以太网Sockets客户端设计实现

    C#以太网Sockets客户端设计实现 概述 C#以太网Sockets客户端是实现网络通信的好方法。使用C#语言和Socket API设计和实现以太网Sockets客户端非常简单。本攻略将介绍如何使用C#设计和实现以太网Sockets客户端。 设计与实现步骤 步骤1:创建Socket对象 首先,需要创建一个Socket对象来处理网络连接。以下代码演示如何创建…

    C# 2023年6月1日
    00
  • 详解.NET 4.0中的泛型协变(covariant)和反变(contravariant)

    在讲解.NET 4.0中的泛型协变和反变之前,需要先了解一下泛型的一些基本概念。 泛型的基本概念 在 C# 中,泛型是为了让我们在编写代码时更加灵活而设计的一个特性。泛型的核心是参数化类型,它可以让我们在编写代码时,不确定类型、保证类型安全、重用代码。通俗的说,泛型就是让代码能够适用于任何数据类型,如List、Dictionary等。 那么,什么是泛型协变和…

    C# 2023年6月3日
    00
  • WPF的控件字符串内容使用StringFormat进行字符串转换

    在WPF中TextBlock的Text有时内容只需要改变个别数字,而不需要所以内容都修改,这时候就要使用StringFormat, 如: <TextBlock Text=”I have xxx friends”/> 这里面的xxx是个变量,那在Binding时应该怎样写呢 <TextBlock Text=”{Binding FirendNu…

    C# 2023年4月18日
    00
  • JS中substring与substr的用法

    JS中的substring和substr是用来截取字符串的方法,这两个方法虽然都能实现截取字符串的功能,但是它们有一些不同之处。以下是详细的讲解: substring方法 substring方法是用来截取字符串中的一部分,它接受两个参数,分别是起始位置和结束位置(不包括结束位置的字符)。如果只传入了一个参数,则从该参数所在位置截取到字符串末尾。 以下是一个示…

    C# 2023年6月7日
    00
  • .NET反向代理组件YARP介绍

    以下是“.NET反向代理组件YARP介绍”的完整攻略: 什么是YARP YARP(Yet Another Reverse Proxy)是一个开源的反向代理组件由微软开发。它是一个轻量级、高性能、可扩展的反向代理组件,可以用于构建高性能的服务网关、API网关等。 YARP的特性 YARP具有以下特性: 支持HTTP、HTTPS、WebSocket等协议 支持负…

    C# 2023年5月12日
    00
  • C#基于Socket套接字的网络通信封装

    C#基于Socket套接字的网络通信封装 本文将介绍如何使用C#基于Socket套接字的网络通信封装进行网络编程,包括创建Socket、连接服务器、传输数据等操作。 创建Socket 在C#中,使用Socket类来创建Socket。其中SocketType指定了Socket的类型(Stream、Dgram、Raw等),ProtocolType指定了使用的协议…

    C# 2023年6月6日
    00
  • 10本最佳C#编程的书籍推荐

    10本最佳C#编程的书籍推荐攻略 为什么要学习C#编程 C#是一种广泛使用的面向对象编程语言,它最初是由微软开发的,用于开发Windows操作系统。C#的语法结构类似于C++和Java,是一种高效、可靠和安全的编程语言。今天,C#已经成为构建Windows桌面应用程序、Web应用程序和游戏的主要语言之一。学习C#编程可以为您在编写高质量应用程序时提供广泛的工…

    C# 2023年6月1日
    00
  • C#使用 NAudio 实现音频可视化的方法

    C#使用 NAudio 实现音频可视化的方法 NAudio 是一款C#语言开发的音频处理库,可以帮助我们完成各种音频处理任务,包括音频的播放、录制、混音等操作。在本文中,我们将介绍如何使用 NAudio 实现音频可视化。 第一步:引入 NAudio 库 首先,我们需要在项目中引入 NAudio 库。在Visual Studio中,可以通过NuGet添加依赖项…

    C# 2023年6月7日
    00
合作推广
合作推广
分享本页
返回顶部