EF6 Code First:默认值覆盖MigrationCodeGenerator及属性式配置
用自定义属性实现EF默认值的代码层面配置
我之前也碰到过同样的困扰——常规的EF默认值配置总是把默认值直接生成到SQL脚本里,没法在代码层面做统一管理。后来我用自定义属性的方式解决了这个问题,分享下我的实现方案:
实体属性使用示例
在实体类的目标属性上标记自定义的SqlDefaultValue属性,直接指定数据库层面的默认值表达式:
[SqlDefaultValue(DefaultValue = "getutcdate()")] public DateTime CreatedDateUtc { get; set; }
自定义属性定义
首先需要定义这个用来存储默认值配置的SqlDefaultValueAttribute:
[AttributeUsage(AttributeTargets.Property, AllowMultiple = false)] public class SqlDefaultValueAttribute : Attribute { public string DefaultValue { get; set; } }
在OnModelCreating中生效配置
最后要在你的DbContext的OnModelCreating方法里,通过反射读取属性上的标记,把默认值配置应用到EF模型中:
protected override void OnModelCreating(ModelBuilder modelBuilder) { // 遍历所有实体类型 foreach (var entityType in modelBuilder.Model.GetEntityTypes()) { // 遍历实体的每个属性 foreach (var property in entityType.GetProperties()) { // 读取属性上的SqlDefaultValueAttribute var sqlDefaultAttr = property.PropertyInfo?.GetCustomAttribute<SqlDefaultValueAttribute>(); if (sqlDefaultAttr != null) { // 设置SQL默认值 property.SetDefaultValueSql(sqlDefaultAttr.DefaultValue); } } } }
这样配置后,EF会在迁移代码中生成对应的默认值逻辑,而不是直接把默认值硬编码到SQL脚本里,完全满足代码层面控制默认值的需求。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

