如何强制Entity Framework 6使用nvarchar(MAX)?已尝试多种方法未果
如何在EF6中强制使用nvarchar(MAX)
我之前也碰到过类似的糟心事,EF6有时候对nvarchar(MAX)的映射确实有点“认死理”,结合你用的EF6.2.0和SQL2014 Express版本,给你几个亲测有效的解决办法:
数据注解的正确打开方式
你试过的[Column(TypeName = "nvarchar(MAX)")]本身是正确的,但要注意别同时搭配[MaxLength]或[StringLength]——这些属性会让EF优先使用指定的长度值,直接覆盖MAX的设置。正确的实体属性写法应该是这样:public class Date { [Column(TypeName = "nvarchar(MAX)")] public string test { get; set; } }Fluent API的配置避坑
你写的modelBuilder.Entity<Date>().Property(o => o.test).HasColumnType("nvarchar(MAX)")逻辑没问题,但要确保同一属性没有设置HasMaxLength。比如如果之前加过.HasMaxLength(4000),就会把MAX的配置冲掉。干净的Fluent配置应该是:protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Entity<Date>() .Property(o => o.test) .HasColumnType("nvarchar(MAX)"); // 这里别加.HasMaxLength(),除非你明确要限制长度 }Code First迁移的清理工作
如果你用的是Code First迁移,有时候旧的迁移文件会残留之前的长度设置,导致新配置不生效。可以试试:- 先备份好现有迁移文件,然后删除它们
- 重新生成初始迁移:
Add-Migration InitialCreate -Force - 最后更新数据库:
Update-Database
另外提个小细节:SQL Server里,不指定长度的nvarchar会被EF默认映射成nvarchar(4000),所以单独的[Column(TypeName = "nvarchar")]肯定没用,必须明确写nvarchar(MAX)才行。
内容的提问来源于stack exchange,提问作者Sean
相关产品推荐
相关产品推荐

