从ASP.NET MVC迁移至Core后,如何在EF Core的OnModelCreating中设置默认值?
在EF Core的OnModelCreating中设置属性默认值的方案
嘿,我之前也踩过EF6转EF Core时默认值设置的坑,给你整理了几种在OnModelCreating里实现的靠谱方法,对应不同的使用场景:
1. 数据库层面的默认值(推荐用于持久化时的自动赋值)
如果你希望数据库在插入数据时自动给字段填充默认值(和EF6里数据库默认值的逻辑一致),可以用EF Core的Fluent API提供的HasDefaultValue()或HasDefaultValueSql()方法:
- 针对动态默认值(比如当前时间):
protected override void OnModelCreating(ModelBuilder modelBuilder) { // SQL Server用GETDATE(),MySQL用NOW(),PostgreSQL用CURRENT_TIMESTAMP modelBuilder.Entity<Post>() .Property(p => p.CreatedAt) .HasDefaultValueSql("GETDATE()"); }
- 针对固定默认值(比如布尔值、数字):
modelBuilder.Entity<User>() .Property(u => u.IsActive) .HasDefaultValue(true);
2. 实体实例化时的默认值(内存层面赋值)
如果你希望在创建实体对象的瞬间就拥有默认值(不需要依赖数据库),虽然更推荐直接在实体构造函数里初始化,但如果一定要在OnModelCreating里配置,也可以用HasDefaultValue():
modelBuilder.Entity<Product>() .Property(p => p.InStock) .HasDefaultValue(0);
当然,更直观的方式是在实体类里写构造函数,这样内存中创建对象时就会自动赋值:
public class Product { public int Id { get; set; } public string Name { get; set; } public int InStock { get; set; } public Product() { InStock = 0; } }
3. 和EF6的核心区别
EF6里你可能会结合HasDatabaseGeneratedOption(DatabaseGeneratedOption.Computed)来设置默认值,但在EF Core中,HasDefaultValueSql()已经隐含了“数据库计算赋值”的逻辑,不需要额外配置这个选项,除非你有更复杂的计算字段需求。
另外,EF Core 3.0+对可空类型的默认值支持更友好,比如给decimal类型的折扣字段设默认值:
modelBuilder.Entity<Order>() .Property(o => o.Discount) .HasDefaultValue(0.0m);
内容的提问来源于stack exchange,提问作者Rodrigo de Farias
相关产品推荐
相关产品推荐

