C#中如何使用EF Core的全局配置?如何设置默认值?

幻夢星雲
发布: 2025-10-01 14:42:01
原创
712人浏览过
通过OnModelCreating实现EF Core全局配置,可统一设置软删除过滤器、属性默认值(如CreatedAt使用HasDefaultValueSql)、字符串最大长度,并利用模型约定自动化处理通用规则,减少重复代码,提升数据模型一致性与维护性。

c#中如何使用ef core的全局配置?如何设置默认值?

在使用 EF Core 时,全局配置和默认值设置能显著减少重复代码,提升数据模型的一致性和维护性。通过 OnModelCreating 方法,你可以在 DbContext 中统一设置实体行为,比如默认值、字段长度、软删除等。

1. 使用 OnModelCreating 进行全局配置

EF Core 的全局配置主要在 DbContext 的 OnModelCreating 方法中完成。你可以遍历所有实体类型,对特定属性或符合规则的字段进行统一处理。

例如,为所有包含 IsDeleted 属性的实体启用软删除:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    foreach (var entityType in modelBuilder.Model.GetEntityTypes())
    {
        var entity = modelBuilder.Entity(entityType.ClrType);

        // 查找是否有 IsDeleted 属性
        var isDeletedProperty = entityType.FindProperty("IsDeleted");
        if (isDeletedProperty != null && isDeletedProperty.PropertyInfo?.PropertyType == typeof(bool))
        {
            // 设置查询过滤器:只返回未删除的数据
            entity.HasQueryFilter(e => EF.Property<bool>(e, "IsDeleted") == false);
        }
    }

    base.OnModelCreating(modelBuilder);
}
登录后复制

2. 为属性设置默认值

你可以通过 HasDefaultValueHasDefaultValueSql 来设置列的默认值。

  • HasDefaultValue:设置常量默认值
  • HasDefaultValueSql:设置数据库函数或表达式
示例:为创建时间设置默认值

modelBuilder.Entity<Blog>()
    .Property(b => b.CreatedAt)
    .HasDefaultValueSql("GETDATE()"); // SQL Server
    //.HasDefaultValueSql("datetime('now')"); // SQLite
登录后复制

设置布尔字段的默认值

modelBuilder.Entity<User>()
    .Property(u => u.IsActive)
    .HasDefaultValue(true);
登录后复制

3. 全局设置字符串字段最大长度

避免每个字符串属性都手动指定长度,可在 OnModelCreating 中统一处理。

foreach (var entityType in modelBuilder.Model.GetEntityTypes())
{
    foreach (var property in entityType.GetProperties())
    {
        if (property.ClrType == typeof(string))
        {
            property.SetMaxLength(200); // 统一设为200
        }
    }
}
登录后复制

4. 使用约定(Conventions)简化配置(EF Core 7+)

从 EF Core 7 开始支持更高级的模型约定,可以封装常用配置逻辑。

如知AI笔记
如知AI笔记

如知笔记——支持markdown的在线笔记,支持ai智能写作、AI搜索,支持DeepseekR1满血大模型

如知AI笔记27
查看详情 如知AI笔记
示例:自动为 CreatedAt 设置默认值

在 OnModelCreating 中添加:

modelBuilder.Entity<Blog>()
    .Property(b => b.CreatedAt)
    .HasDefaultValueSql("GETUTCDATE()");
登录后复制

或者结合反射,自动识别命名规范的字段:

foreach (var entityType in modelBuilder.Model.GetEntityTypes())
{
    var createdAtProperty = entityType.FindProperty("CreatedAt");
    if (createdAtProperty?.ClrType == typeof(DateTime))
    {
        modelBuilder.Entity(entityType.ClrType)
            .Property("CreatedAt")
            .HasDefaultValueSql("GETUTCDATE()");
    }
}
登录后复制

基本上就这些。合理利用 OnModelCreating 和模型构建器,能让你的 EF Core 配置更简洁、统一。关键是提前规划好字段命名规范和通用行为,再通过循环或条件判断实现自动化配置。

以上就是C#中如何使用EF Core的全局配置?如何设置默认值?的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号