OnModelCreating 的目的 - EF Core 数据库优先方法

Purpose of OnModelCreating - EF Core Database first Approach

我正在先用数据库学习 EF Core。逆向后获取entities和DbContext没有问题。但是我无法理解 DbContext 中的 OnModelCreating 方法的作用(或目的)(数据库优先方法)。 这是代码片段。

public partial class VitiLevuContext : DbContext
{ 
    public virtual DbSet<Order> Orders { get; set; }
    public virtual DbSet<Invoice> Invoices { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Invoice>(entity =>
        {
            entity.ToTable("Invoice");
            entity.Property(e => e.DueAmount)
            .IsRequired();
            entity.Property(e => e.PaidAmount).HasColumnType("money");
            entity.HasOne(d => d.Order)
                .WithMany(p => p.Invoices)
                .OnDelete(DeleteBehavior.Cascade)
                .HasForeignKey(d => d.OrderId)
                .HasConstraintName("FK__Invoice__OrderId__44FF419A");
        });
        modelBuilder.Entity<Order>(entity =>
        {
            entity.ToTable("Order");
        });
        OnModelCreatingPartial(modelBuilder);
    }
    partial void OnModelCreatingPartial(ModelBuilder modelBuilder);
}

数据库有关系和“NOT NULL Contraints”。

  1. 更改 TABLE [dbo]。[发票] 添加外键 ([OrderId]) 参考 [dbo]。删除级联时的订单。
  2. ALTER TABLE [dbo].[Invoice] ADD [DueAmount] int NOT NULL

OnModelCreating 方法表现良好。我创建了非常简单的 Rest API 项目并针对 Order/Invoice 测试了 add/delete。 “NOT NULL Constraints”和“Cascade deleting”可以在数据库而不是 EF 模型端进行验证。 (在创建一个 DueAmount 为 null 的发票实例的情况下,我预计在提交到 SQL 之前会出现异常)

我的问题很简单。 如果不考虑迁移,我可以删除“OnModelCreating”方法吗? (我认为 OnModelCreating 方法仅用于迁移目的。)

如果您遵循 Entity framework 模型命名约定并且您的模型直接反映了您的数据库 table 名称、列名称等,则不需要 OnMODelCreating 方法。这是因为 entity framework 会在后台生成绑定。

但是,如果您想要自定义,例如,您的模型字段名称与您的数据库 table 列名称不匹配,您可以在 OnModelCreating 方法上进行配置。使用此配置的另一种方法称为 fluent API.

这并不意味着您必须使用 OnModelCreating 方法。还有其他自定义选项。这是DataAnotation。

例如:

如果您有一个名为 User...

的模型
public class User
{
    public int Id { get; set; }
    public string FullName { get; set; }
    public string Password { get; set; }
}

在您的 DbContext 上,您设置以下内容

public AppDbContext : DbContext
{
   public AppDbContext(DbContextOptions<AppDbContext> options) {}

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

因此,根据 convention,Entity framework 期望

  1. A table 名为 Users,因为您在 DbSet 属性 上为用户模型使用的名称。
  2. 它使用 Id 作为主键.. 因为模型 属性 name Id

Entity framework 将为您设置好这一切。

当我们进行自定义配置时,假设您的型号属性名称密码与用户table列名称密码。您必须通过以下方式之一告诉 entity framework。

  1. 使用 OnModelCreating 方法(流畅 API)

     protected override void OnModelCreating(ModelBuilder modelBuild)
     {
         modelBuilder.Entity<User>(entity => {
              entity.Property(p => p.Password)
                    .HasColumnName("Pwd");
         })  
     }
    
  2. 另一种方式是数据标注

     public class User
     {
         public int Id { get; set; }
         public string FullName { get; set; }
    
         [Column("Pwd")]
         public string Password { get; set; }
     }