使用Always Encryption遇报错:属性非字符串/字节数组无法配置长度
Always Encryption 加载数据时的属性长度配置错误排查
先还原下你的场景:你给数据库部分字段启用了Always Encryption,并且测试了所有主密钥存储类型(当前用户、本地机器、CNG),应用端的连接字符串配置如下:
<connectionStrings> <add name="DataContext" connectionString="data source=our-PC\SS2016;initial catalog=testdb;integrated security=True; MultipleActiveResultSets=True;App=EntityFramework;Column Encryption Setting=enabled" providerName="System.Data.SqlClient" /> </connectionStrings>
但在Web环境中用EF执行var datas = context.tbUsers.ToList();加载数据时,遇到了这个错误:
Additional information: The property 'Name' is not a String or Byte array. Length can only be configured for String and Byte array properties.
问题原因
这个错误的核心是你在EF实体类中,给非string/byte[]类型的Name属性配置了长度限制。
Always Encryption和EF的结合校验规则里,只有字符串(string)或者字节数组(byte[])类型的属性,才允许设置MaxLength/Length这类长度相关的配置。如果你的Name属性是其他类型(比如int、DateTime甚至自定义类型),但你在实体配置里加了长度约束——不管是用数据注解(比如[MaxLength(50)])还是Fluent API(比如.HasMaxLength(50))——都会触发这个报错。
举个典型的错误配置例子:
// 错误示例:int类型的Name加了MaxLength注解 public class tbUser { public int Id { get; set; } [MaxLength(50)] public int Name { get; set; } }
或者用Fluent API的错误写法:
// 错误示例:给非string/byte[]的Name设置长度 modelBuilder.Entity<tbUser>() .Property(u => u.Name) .HasMaxLength(50);
解决建议
- 先检查
tbUsers实体类里Name属性的实际类型,确认它是不是string或者byte[] - 如果不是这类允许的类型,直接移除该属性上所有和长度相关的配置(包括数据注解和Fluent API里的设置)
- 如果需要对这个属性做约束,根据它的类型用对应的校验方式(比如数值类型用
[Range]注解,日期类型做范围校验等)
内容的提问来源于stack exchange,提问作者user3237530
相关产品推荐
相关产品推荐

