我为使用Always Encrypted加密的列的表创建了数据库优先EDM。我们的业务禁止直接访问表,所以我也使用存储过程来访问所有数据库。
当我尝试插入行时,出现以下错误:
System.Data.SqlClient.SqlException:操作数类型碰撞:varchar(8000) 用(encryption_type ='RANDOMIZED'加密, encryption_algorithm_name ='AEAD_AES_256_CBC_HMAC_SHA_256', column_encryption_key_name ='XXXXXX', column_encryption_key_database_name ='XXXXXX')collation_name = 'SQL_Latin1_General_CP1_CI_AS'与varchar(60)不兼容 用(encryption_type ='RANDOMIZED'加密, encryption_algorithm_name ='AEAD_AES_256_CBC_HMAC_SHA_256', column_encryption_key_name ='XXXXXX', column_encryption_key_database_name ='XXXXXX')collation_name = “SQL_Latin1_General_CP1_CI_AS
存储过程参数声明为与表定义匹配的varchar(60)。
因为我使用的是Always Encrypted,所以参数定义必须与列定义匹配。但是,EF会为此属性生成一个声明为varchar(8000)的参数,这违反了加密协议。
有没有办法强制EF使用声明的参数长度?
答案 0 :(得分:0)
已解决,请参阅说明here。在这种特定情况下,EDM包含存储过程的两个定义:一个在StorageModels元素中,一个在ConceptualModels元素中。在StorageModels定义中设置MaxLength属性可以解决此问题。