存储过程MVC3实体框架 - Varbinary

时间:2012-04-03 10:26:08

标签: asp.net-mvc-3 entity-framework

我的Emp表格如下:

Employee

我创建了一个类似于

的存储过程
ALTER PROCEDURE [dbo].[GetAllEmployees]
AS
BEGIN
OPEN SYMMETRIC KEY TestTableKey DECRYPTION
BY CERTIFICATE EncryptTestCert
SELECT  
        EMPId,
        Firstname,
        Lastname,
        AddessId,
        JobId,
        DateofBirth,
        CONVERT(NVARCHAR(50),DECRYPTBYKEY(EncryptFirstname)) AS [EncryptFirstname],
        CONVERT(NVARCHAR(50),DECRYPTBYKEY(EncryptLastname)) AS [EncryptLastname]
FROM 
        EMPloyee
END

我创建存储过程的原因是将表中的一些varbinary列转换为字符串,并将其与MVC3中的EF一起使用。

我在模型中映射过程的方式如下所示。

FunctionImport1 into Model(EF)

FunctionImport2 into Model(EF)

在我的EmployeeViewModel中,这是我将属性映射到字段

的方式
[Description("EmployeeDetails")]
public class EmployeeViewModel: IEmployeeModel
{
   public Guid EmpId { get; set; }
   [Display(Name = "EncryptLastName")]
   public byte[] EncryptLastName { get; set; }

   [Display(Name = "EncryptFirstName")]
   public byte[] EncryptFirstName { get; set; }

   [Display(Name = "LastName")]
   public string LastName { get; set; }
}

在我的服务方法中访问存储过程时,这就是我访问它的方式。

public List<EmployeeViewModel> GetEmpList()
{
   var ent = new EncryptionEntities();
   List<Employee> allEmp = new List<Employee>();
   allEmp = ent.GetEmployees().ToList();
   ConvertViewModelObject cvmo = new ConvertViewModelObject();
   List<EmployeeViewModel> empVM = new List<EmployeeViewModel>();

   foreach (var item in allEmp)
   {
      empVM.Add(cvmo.ConvertFromEmployee(item));
   }

   return empVM.ToList();
}
此方法中的

错误

  

'Employee'上的'EncryptFirstname'属性无法设置为a   '字符串值。您必须将此属性设置为类型的非null值   '字节[]'。

在我的存储过程中,如果我只是简单地显示EncryptFirstname,而不转换为字符串,则不会发生错误,但我将得到的值是system.byte[]

但它必须是字符串格式,以便我能理解它的价值是什么?

请告知,我该怎么做才能正确显示。

这是我将实体转换为entityViewmodel的方式。

public EmployeeViewModel ConvertFromEmployee(Employee emp)
{
   if (emp == null)
      return null;

   var evm = new EmployeeViewModel();

   evm.LastName = emp.Lastname;
   evm.EncryptFirstName = emp.EncryptLastName;

   return evm;
}

1 个答案:

答案 0 :(得分:0)

我发现这个article非常有帮助,我在标题为“导入返回实体以外的类型的存储过程”一节中找到了答案。所以解决方案是在上面的最后一个屏幕截图中,您在对话框“添加功能导入”而不是选择实体单选按钮,首先单击“获取列信息”,然后单击“创建新的复杂类型”按钮。现在您可以返回并选择“复杂”单选按钮,然后从下拉列表中选择此新类型。现在你可以设置你的视图来使用这个模型,你就可以了。