Entity Framework
格式化特性

数据特性

⚠️

该文档可能已过期。

LinqSharp.EFCoreCodeFirst 模型提供了更多且易于使用的数据特性:

  • 表设计数据特性
  • 字段标准化数据特性(本文)

表设计数据特性,是调用 Flunt API 的替代方案,方便编写 CodeFirst 模型。


字段标准化数据特性

重写 DbContext 下的 OnModelCreating 方法以启用 LinqSharp 扩展功能:

public class ApplicationDbContext : DbContext
{
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
        LinqSharpEF.OnModelCreating(this, modelBuilder);
    }
}

AutoX

Auto 系列注释是为数据提交到数据库前,用来规范数据值的自动处理标记。

目前内置标记包括:

类名说明支持的属性生效规则
AutoCreationTime使用创建时间DateTime / DateTimeOffsetAdded
AutoLastWriteTime自动修改时间DateTime / DateTimeOffsetAdded, Modified
AutoCondensed使用紧凑字符串stringAdded, Modified
AutoLower转换为小写字母stringAdded, Modified
AutoUpper转换为大写字母stringAdded, Modified
AutoTrim去除边界空格stringAdded, Modified

如果需要自定义,应创建 AutoAttribute 的子类型。

例如,设计一个 Attribute,用于转换奇数值(若 value 为偶数,返回原值,否则返回 valule * 2):

// If `value` is odd, return `value * 2`, otherwise return `value`.
public class AutoEvenAttribute : AutoAttribute
{
    public AutoEvenAttribute() : base(EntityState.Added, EntityState.Modified) { }
 
    public override object Format(object entity, Type propertyType, object value)
    {
        if (propertyType != typeof(int))
        {
            throw Exception_NotSupportedTypes(propertyType, nameof(propertyType));
        }
 
        if (value is int @int && @int % 2 == 1)
            return @int * 2;
        else return 0;
    }
}

模型示例:

public class Model
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid Id { get; set; }
 
    [AutoTrim]
    public string ForTrim { get; set; }
 
    [AutoUpper]
    public string ForUpper { get; set; }
 
    [AutoLower]
    public string ForLower { get; set; }
 
    [AutoCondensed]
    public string ForCondensed { get; set; }
    
    [AutoEven]
    public int ForEven { get; set; }
}

创建实例模型:

var model = new Model
{
    ForTrim = "   127.0.0.1 ",
    ForLower = "LinqSharp",
    ForUpper = "LinqSharp",
    ForCondensed = "  Welcome to  use   LinqSharp  ",    
    ForEven = 101,
};

SaveChanges 后,Model 中的属性将被设置为:

var model = new Model
{
    // "   127.0.0.1 " -> "127.0.0.1"
    ForTrim = "127.0.0.1",
    
    // "LinqSharp" -> "linqsharp"
    ForLower = "linqsharp",
    
    // "LinqSharp" -> "LINQSHARP"
    ForUpper = "LINQSHARP",
    
    // "  Welcome to  use   LinqSharp  " -> "Welcome to use LinqSharp"
    ForCondensed = "Welcome to use LinqSharp",
    
    // 101 -> 202
    ForEven = 202,
};