3

我需要一些帮助来将此过程(见下文)转换为 Entity Framework 4.0。有没有人对如何移植这个有任何建议。目标项目包括;Silverlight 4、WCF RIA 服务、EF 4.0、SQL Server 2008 R2。

我唯一的要求是它需要放在托管代码中,而不是存储过程中。

    Try 
    {
        SqlCommand cmd = new SqlCommand();
        cmd.Connection = cn;
        cmd.CommandType = CommandType.Text;
        string sql = "OPEN SYMMETRIC KEY " + this._encryptKey;
        sql += " DECRYPTION BY CERTIFICATE " + this._encrpytCert; 
        sql += " SELECT TOP (1) CONVERT(nvarchar(50),DECRYPTBYKEY(Field1)) AS Name";
        sql += " FROM Table3"; 
        sql += " ORDER BY CONVERT(nvarchar(50),DECRYPTBYKEY(Field1))";
        cmd.CommandText = sql;
        Name = (String)cmd.ExecuteScalar();
        bRtn = false;
    }
        catch (Exception ex)
    {
        System.Diagnostics.Debug.Print(ex.ToString());
    }

请让我知道我应该如何设置它,谢谢!

4

2 回答 2

1

您可以通过 Entity Framework 运行查询并使用该ObjectContext.ExecuteStoreQuery<>()函数获得强类型结果(请参阅此示例)。

然而,不幸的是,我认为没有任何方法可以避免自己生成 T-SQL 语句。虽然您可以通过SqlFuntions类在 Linq-to-Entities 查询中使用 SQL Server 的许多函数,但没有转换 SQL Server 函数的DECRYPTBYKEY函数,更不用说实体框架不会生成打开密钥的语句这一事实.

于 2013-03-16T03:15:38.197 回答
0

要在查询敏感数据之前解密,您需要做的就是在 EF ObjectContext 连接中使用 DbTransaction。

IE

  • 连接.打开();
  • 连接.BeginTransaction();
  • 使用 ExecuteStoreCommand 执行您的“OPEN SYMMETRIC KEY...”命令或存储过程执行您的敏感数据查询、存储过程等。
  • 如果需要,提交或回滚您的事务

这会强制 EF 保持相同的数据库连接,因为您已经启动了一个数据库事务,这是有道理的,因为您可能会执行一大堆 SP 作为同一个数据库事务的一部分。

于 2014-06-19T23:28:09.083 回答