Хранимая процедура MVC3 Entity Framework - Varbinary - PullRequest
2 голосов
/ 03 апреля 2012

У меня есть 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 в таблице в строки и использовать ее с EF в MVC3.

Способ, которым я описал процедуру в модели, описан ниже.

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();
}

ОШИБКА в этом методе:

Свойство 'EncryptFirstname' в 'Employee' не может быть установлено в 'Строковое значение. Вы должны установить для этого свойства ненулевое значение типа 'Byte []'.

В моей хранимой процедуре, если я просто отображаю 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 голосов
/ 15 февраля 2013

Я нашел эту статью очень полезной и нашел ответ в разделе «Импорт хранимых процедур, которые возвращают типы, отличные от сущностей».Таким образом, решение находится на последнем снимке экрана выше, где вы находитесь в диалоговом окне «Добавление функции импорта» вместо того, чтобы выбирать радиокнопку «Сущности», сначала нажмите «Получить информацию о столбце», затем нажмите «Создать новый сложный тип»кнопка.Теперь вы можете вернуться назад и выбрать переключатель «Сложный» и выбрать этот новый тип из выпадающего списка.Теперь вы можете просто настроить вид для использования этой модели, и все будет готово.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...