探索 Code First、Database First 和配置技术

作者:微信公众号:【架构师老卢】
9-18 18:12
93

EF Core 中的配置类似于告知应用程序如何与数据库交互的规则和准则。它们可帮助您将数据模型映射到数据库,确保一切顺利运行。但在我们深入探讨这些配置的详细信息之前,请务必了解在 EF Core 中进行开发的不同方式,特别是 Code FirstDatabase First

在本文中,我们将首先介绍这两种方法,帮助您了解何时以及为什么可以选择其中一种方法。有了这个基础后,我们将开始探索你可以在 EF Core 中使用的各种配置来构建高效可靠的应用程序。

让我们一起一步一步地开始这段旅程,确保一切都清晰易懂。

1. 代码优先

Code First 是一种使用 C# 类定义数据模型的方法,EF Core 从这些类生成数据库架构。在启动新项目或希望完全控制代码时,通常会使用此方法。

优势

  • 控制代码:您可以完全控制实体类,从而获得干净且可维护的代码库。
  • 迁移支持:通过迁移轻松管理数据库架构更改。
  • 无需初始数据库:您不需要现有数据库即可启动;EF Core 将为你创建它。

如何运作

  1. 定义实体:创建表示实体的 C# 类。
  2. 配置 DbContext:设置以管理这些实体。DbContext
  3. 使用迁移:使用 EF Core 的迁移来创建和更新数据库架构。

例:

public class Product  
{  
    public int ProductId { get; set; }  
    public string Name { get; set; }  
    public decimal Price { get; set; }  
}  
  
public class ApplicationDbContext : DbContext  
{  
    public DbSet<Product> Products { get; set; }  
  
    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)  
    {  
        optionsBuilder.UseSqlServer("YourConnectionStringHere");  
    }  
}

要创建数据库,您将使用:

dotnet ef migrations add InitialCreate  
dotnet ef database update

2. 数据库优先

当您拥有现有数据库,并且想要生成实体类并基于该架构生成实体类时,将使用 Database First。这对于使用旧数据库非常有用。DbContext

优势

  • 使用现有数据库:非常适合已定义数据库架构的项目。
  • 自动代码生成:EF Core 可以为你生成数据模型。

如何运作

  1. 基架模型:使用 EF Core 工具从现有数据库搭建模型基架。
  2. 生成的代码:EF Core 生成映射到现有数据库表的 and 实体类。DbContext

您可以使用以下命令为模型搭建基架:

dotnet ef dbcontext scaffold "YourConnectionStringHere" Microsoft.EntityFrameworkCore.SqlServer -o Models

此命令将在指定的输出目录(例如 )中生成实体类。DbContextModels

了解 EF Core 配置:从约定到 Fluent API

现在,我们已经探索了两种主要方法(Code First 和 Database First),现在是时候深入了解配置 EF Core 模型的细节了。无论您是从头开始构建数据库还是使用现有架构,了解如何配置模型对于创建高效且可维护的应用程序都至关重要。EF Core 提供了多种方法来定义这些配置,从利用根据命名模式自动设置模型的约定,到使用更精确、更灵活的 Fluent API。让我们首先探索 EF Core 配置在后台的工作原理,从默认行为(称为按约定配置)开始。

按约定配置

EF Core 使用约定根据实体类中属性的名称和类型自动配置数据模型。约定是默认行为,需要的代码量最少。

关键约定:

1. 主键

EF Core 采用名为 or 是 PK 的属性。Id<EntityName>Id

public class Product  
{  
    public int ProductId { get; set; } // Assumed to be the primary key  
    public string Name { get; set; }  
}  

2. 外键

假定名为 的属性为 FK。<NavigationPropertyName>Id

public class Order  
{  
  public int OrderId { get; set; }  
  public int CustomerId { get; set; } // Assumed to be a foreign key  
  public Customer Customer { get; set; } // Navigation property to customer  
}

3. 关系

导航属性定义实体之间的关系。EF Core 将根据导航属性及其类型推断关系的类型。

public class Customer  
{  
    public int CustomerId { get; set; }  
    public ICollection<Order> Orders { get; set; } // One-to-many relationship  
}

4. 命名约定

表和列名称默认为实体和属性名称。

注意: 默认情况下,EF Core 中不应用复数形式。

5. 级联删除

EF Core 为所需关系(即外键不可为 null 的关系)配置级联删除行为。

使用 Fluent API 进行配置

Fluent API 提供了一种配置 EF Core 模型的方法,其精度和灵活性比单独的约定更高。它通常用于 .OnModelCreatingDbContext

Fluent API 示例:

  • **主键配置:**显式指定主键。
protected override void OnModelCreating(ModelBuilder modelBuilder)  
{  
    modelBuilder.Entity<Product>()  
        .HasKey(p => p.ProductId);  
}
  • 外键配置: 显式定义外键。
protected override void OnModelCreating(ModelBuilder modelBuilder)  
{  
    modelBuilder.Entity<Order>()  
        .HasOne(o => o.Customer)  
        .WithMany(c => c.Orders)  
        .HasForeignKey(o => o.CustomerId);  
}
  • 表和列命名: 自定义表和列名称。
protected override void OnModelCreating(ModelBuilder modelBuilder)  
{  
    modelBuilder.Entity<Product>()  
        .ToTable("ProductsTable")  
        .Property(p => p.Name)  
        .HasColumnName("ProductName");  
}
  • 复合键: 定义复合主键。
protected override void OnModelCreating(ModelBuilder modelBuilder)  
{  
    modelBuilder.Entity\<OrderDetail>()  
        .HasKey(od => new { od.OrderId, od.ProductId });  
}
  • 索引配置: 定义特定列的索引。
protected override void OnModelCreating(ModelBuilder modelBuilder)  
{  
    modelBuilder.Entity<Product>()  
        .HasIndex(p => p.Name)  
        .HasDatabaseName("IX_Product_Name");  
}

在 EF Core 配置之旅的第一部分,我们探讨了 Code FirstDatabase First 的基本方法,这两种强大的方法用于构建应用程序与数据库的交互。了解这些方法至关重要,因为它们为如何在 EF Core 中配置模型奠定了基础。

我们还介绍了 EF Core 用于简化配置过程的自动约定,演示了以最少的工作量可以实现多少工作。但是,随着应用程序的增长和需求变得更加复杂,仅依靠约定可能还不够。这时您需要仔细研究更高级的配置技术。

相关留言评论
昵称:
邮箱:
阅读排行