如何强制Entity Framework 6生成与其对应的数据库列等效大小的参数

时间:2018-06-15 13:11:58

标签: entity-framework-6 always-encrypted

我为使用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')collat​​ion_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')collat​​ion_name =   “SQL_Latin1_General_CP1_CI_AS

存储过程参数声明为与表定义匹配的varchar(60)。

因为我使用的是Always Encrypted,所以参数定义必须与列定义匹配。但是,EF会为此属性生成一个声明为varchar(8000)的参数,这违反了加密协议。

有没有办法强制EF使用声明的参数长度?

1 个答案:

答案 0 :(得分:0)

已解决,请参阅说明here。在这种特定情况下,EDM包含存储过程的两个定义:一个在StorageModels元素中,一个在ConceptualModels元素中。在StorageModels定义中设置MaxLength属性可以解决此问题。