如何让数据注解覆盖ModelConfigurationBuilder的全局字符串配置
问题
在DbContext的ConfigureConventions方法中全局配置所有字符串类型为varchar(250)且非Unicode,但部分实体属性标注了[Column(TypeName = "varchar(max)")]注解后,生成的迁移仍将这些属性创建为varchar(250),如何让数据注解覆盖全局配置?
配置构建器代码
protected override void ConfigureConventions(ModelConfigurationBuilder configurationBuilder) { configurationBuilder.Properties<string>() .HaveColumnType("varchar(250)") .AreUnicode(false); }
实体代码
[Column(TypeName = "varchar(max)")] public string? AffectedColumns { get; set; }
迁移生成的代码
AffectedColumns = table.Column<string>(type: "varchar(250)", unicode: false, nullable: true)
解决方案
EF Core中ConfigureConventions的全局约定优先级默认高于数据注解,因此会覆盖[Column]注解的配置。要让数据注解优先,需限制全局约定的应用范围,仅对未标注[Column]注解的字符串属性生效:
修改ConfigureConventions代码,添加条件过滤:
protected override void ConfigureConventions(ModelConfigurationBuilder configurationBuilder) { configurationBuilder.Properties<string>() // 仅对未标注ColumnAttribute的属性应用全局配置 .When(property => !property.PropertyInfo.IsDefined(typeof(ColumnAttribute), inherit: false)) .HaveColumnType("varchar(250)") .AreUnicode(false); }
修改后,标注了[Column(TypeName = "varchar(max)")]的属性会使用注解配置,未标注的属性则沿用全局varchar(250)设置,重新生成迁移即可得到预期的varchar(max)类型。
注意:若项目中使用Fluent API单独配置属性,其优先级会高于数据注解和全局约定,需根据实际场景调整配置顺序。
内容的提问来源于stack exchange,提问作者Matthew Verstraete
相关产品推荐
相关产品推荐

