首页 > 解决方案 > 什么是 Entity Framework Core 属性等价于 modelBuilder 的 HasDefaultValueSql?

问题描述

我想使用注释在 Entity Framework Core 中设置我的属性的默认值。问题是数据库没有设置默认值,因此该值没有被传递到数据库层。

我想做类似于modelBuilder's 的事情HasDefaultValueSql

[DefaultValue("400")]
public int LengthInMeters {get; set;}

如何将以下代码转换为属性?

modelBuilder.Entity<Patient>().Property(c => c.LengthInMeters).HasDefaultValueSql("400");

单独使用默认值是行不通的。我想单独使用属性而不必弄乱迁移。

问题:我用 EF 尝试了其他方法,但 Entity Framework Core 没有一些项目。比如modelBuilder.Conventions也不AttributeToColumnAnnotationConvention也不CSharpMigrationCodeGenerator也不modelBuilder.Properties()

标签: c#attributesentity-framework-corecustom-data-attribute

解决方案


这就是我最终要做的,如果有人有更清洁的不那么密集的实施方式,请告诉我。

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    foreach (var entityType in modelBuilder.Model.GetEntityTypes())
    {
        foreach (var property in entityType.GetProperties())
        {
            var memberInfo = property.PropertyInfo ?? (MemberInfo)property.FieldInfo;
            if (memberInfo == null) continue;
            var defaultValue = Attribute.GetCustomAttribute(memberInfo, typeof(DefaultValueAttribute)) as DefaultValueAttribute;
            if (defaultValue == null) continue;                   
            property.SqlServer().DefaultValue = defaultValue.Value;
        }
    }
}       

我可以使用默认值属性在数据库中设置默认值

[DefaultValue("400")]
public int LengthInMeters {get; set;}

推荐阅读