EF Core 中的配置类似于告知应用程序如何与数据库交互的规则和准则。它们可帮助您将数据模型映射到数据库,确保一切顺利运行。但在我们深入探讨这些配置的详细信息之前,请务必了解在 EF Core 中进行开发的不同方式,特别是 Code First 和 Database First。
在本文中,我们将首先介绍这两种方法,帮助您了解何时以及为什么可以选择其中一种方法。有了这个基础后,我们将开始探索你可以在 EF Core 中使用的各种配置来构建高效可靠的应用程序。
让我们一起一步一步地开始这段旅程,确保一切都清晰易懂。
Code First 是一种使用 C# 类定义数据模型的方法,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
当您拥有现有数据库,并且想要生成实体类并基于该架构生成实体类时,将使用 Database First。这对于使用旧数据库非常有用。DbContext
您可以使用以下命令为模型搭建基架:
dotnet ef dbcontext scaffold "YourConnectionStringHere" Microsoft.EntityFrameworkCore.SqlServer -o Models
此命令将在指定的输出目录(例如 )中生成实体类。DbContextModels
现在,我们已经探索了两种主要方法(Code First 和 Database First),现在是时候深入了解配置 EF Core 模型的细节了。无论您是从头开始构建数据库还是使用现有架构,了解如何配置模型对于创建高效且可维护的应用程序都至关重要。EF Core 提供了多种方法来定义这些配置,从利用根据命名模式自动设置模型的约定,到使用更精确、更灵活的 Fluent API。让我们首先探索 EF Core 配置在后台的工作原理,从默认行为(称为按约定配置)开始。
EF Core 使用约定根据实体类中属性的名称和类型自动配置数据模型。约定是默认行为,需要的代码量最少。
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; }
}
假定名为 的属性为 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
}
导航属性定义实体之间的关系。EF Core 将根据导航属性及其类型推断关系的类型。
public class Customer
{
public int CustomerId { get; set; }
public ICollection<Order> Orders { get; set; } // One-to-many relationship
}
表和列名称默认为实体和属性名称。
注意: 默认情况下,EF Core 中不应用复数形式。
EF Core 为所需关系(即外键不可为 null 的关系)配置级联删除行为。
Fluent API 提供了一种配置 EF Core 模型的方法,其精度和灵活性比单独的约定更高。它通常用于 .OnModelCreatingDbContext
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 First 和 Database First 的基本方法,这两种强大的方法用于构建应用程序与数据库的交互。了解这些方法至关重要,因为它们为如何在 EF Core 中配置模型奠定了基础。
我们还介绍了 EF Core 用于简化配置过程的自动约定,演示了以最少的工作量可以实现多少工作。但是,随着应用程序的增长和需求变得更加复杂,仅依靠约定可能还不够。这时您需要仔细研究更高级的配置技术。