51 lines
2.2 KiB
C#
51 lines
2.2 KiB
C#
using Microsoft.EntityFrameworkCore.Metadata.Builders;
|
|
using Microsoft.EntityFrameworkCore.Metadata.Conventions;
|
|
using System;
|
|
using System.ComponentModel.DataAnnotations;
|
|
using System.Linq;
|
|
|
|
namespace IRaCIS.Core.Test
|
|
{
|
|
/// <summary>
|
|
/// Efcore 最新支持批量配置字符串类型长度作为保底的 官网参考:https://learn.microsoft.com/zh-cn/ef/core/modeling/bulk-configuration#conventions
|
|
/// </summary>
|
|
public class MaxStringLengthConvention : IModelFinalizingConvention
|
|
{
|
|
public void ProcessModelFinalizing(IConventionModelBuilder modelBuilder, IConventionContext<IConventionModelBuilder> context)
|
|
{
|
|
foreach (var property in modelBuilder.Metadata.GetEntityTypes()
|
|
.SelectMany(
|
|
entityType => entityType.GetDeclaredProperties()
|
|
.Where(
|
|
property => property.ClrType == typeof(string))))
|
|
{
|
|
|
|
// 获取 MaxLength 特性
|
|
var maxLengthAttribute = property.PropertyInfo?.GetCustomAttributes(typeof(MaxLengthAttribute), false)
|
|
.FirstOrDefault() as MaxLengthAttribute;
|
|
|
|
// 获取 StringLength 特性
|
|
var stringLengthAttribute = property.PropertyInfo?.GetCustomAttributes(typeof(StringLengthAttribute), false)
|
|
.FirstOrDefault() as StringLengthAttribute;
|
|
|
|
// 输出调试信息,看看是哪种特性生效
|
|
if (stringLengthAttribute != null)
|
|
{
|
|
//Console.WriteLine($"{property.Name}: StringLength({stringLengthAttribute.MaximumLength})");
|
|
property.Builder.HasMaxLength(stringLengthAttribute.MaximumLength);
|
|
}
|
|
else if (maxLengthAttribute != null)
|
|
{
|
|
//Console.WriteLine($"{property.Name}: MaxLength (no specific length, allowing max)");
|
|
}
|
|
else
|
|
{
|
|
//Console.WriteLine($"{property.Name}: Default length 200");
|
|
property.Builder.HasMaxLength(200);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|