Entity Framework Core每次新迁移重复添加AlterColumn问题求助
EF Core 重复生成string[]属性AlterColumn迁移的问题解决
问题原因
EF Core在对比模型快照与当前模型时,对于引用类型的默认值(比如string[]数组),默认的比较逻辑会判断实例引用是否相同。而Array.Empty<string>()每次返回的空数组实例,在EF的默认比较逻辑中会被判定为不同的引用,导致EF认为默认值发生了变更,从而每次生成迁移时都添加AlterColumn操作。
解决方案
方法1:使用数据库原生默认值SQL(推荐)
放弃使用.NET对象作为默认值,直接通过HasDefaultValueSql指定数据库层面的空数组默认值,这样EF会对比SQL字符串而非.NET对象实例,避免引用比较的问题。
以PostgreSQL为例(对应你的text[]类型):
modelBuilder.Entity<CustomTab>() .Property(b => b.MyColumn) .HasDefaultValueSql("'{}'::text[]");
方法2:自定义值比较器
为string[]类型配置自定义的ValueComparer,告诉EF通过数组内容而非引用判断是否相等。
modelBuilder.Entity<CustomTab>() .Property(b => b.MyColumn) .HasDefaultValue(Array.Empty<string>()) .Metadata.SetValueComparer(new ValueComparer<string[]>( // 相等判断:数组内容完全一致 (arr1, arr2) => (arr1 == null && arr2 == null) || (arr1 != null && arr2 != null && arr1.SequenceEqual(arr2)), // 哈希码生成:基于数组内容计算 arr => arr?.Aggregate(0, (hash, str) => hash ^ str.GetHashCode()) ?? 0, // 复制逻辑:返回数组副本 arr => arr?.ToArray()));
方法3:手动清理迁移代码(临时方案)
每次生成迁移后,手动删除迁移文件中针对MyColumn的AlterColumn操作。但此方法需要重复操作,不适合长期维护。
内容的提问来源于stack exchange,提问作者Jack
相关产品推荐
相关产品推荐

