EF中[Column(TypeName="varchar(10)")]不生效,如何将benefitID设为varchar(10)?
解决方案
问题根源
你遇到的问题主要有两个原因:一是特性标注在了私有字段上,EF默认基于公共属性做映射,私有字段的特性不会生效;二是[StringLength(20)]和[Column(TypeName="varchar(10)")]长度冲突,且EF对字符串主键默认会生成nvarchar(450)的字段类型。
具体解决步骤
1. 将特性移到公共属性并统一长度配置
把所有数据注解特性标注在公共的BenefitID属性上,同时保证StringLength和Column的长度一致:
private string benefitID; private string benefitContent;//nội dung quyền lợi public virtual ICollection<Job> Jobs { get; set; } [Key] [Column(TypeName = "varchar(10)")] [StringLength(10)] [Required] public string BenefitID { get => benefitID; set => benefitID = value; } public string BenefitContent { get => benefitContent; set => benefitContent = value; } public Benefit() { Jobs = new HashSet<Job>(); }
2. 更新EF迁移脚本(若已生成过迁移)
如果之前已经创建过迁移文件,旧的脚本会保留nvarchar(450)的配置,需要手动修改迁移文件的Up方法:
migrationBuilder.CreateTable( name: "Benefits", columns: table => new { BenefitID = table.Column<string>(type: "varchar(10)", nullable: false), // 其他字段配置... }, constraints: table => { table.PrimaryKey("PK_Benefits", x => x.BenefitID); });
修改完成后,执行迁移命令更新数据库:
- Package Manager Console:
Update-Database - .NET CLI:
dotnet ef database update
3. 用Fluent API强制配置(可选,优先级更高)
如果注解方式仍不生效,可以在DbContext的OnModelCreating方法中用Fluent API直接配置,这种方式优先级高于数据注解:
protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Benefit>() .Property(b => b.BenefitID) .HasColumnType("varchar(10)") .HasMaxLength(10); }
内容的提问来源于stack exchange,提问作者Chiến Trần
相关产品推荐
相关产品推荐

