2012-04-03 6 views
2

Ich habe am Emp Tabelle, die wie folgt aussieht:Stored Procedure MVC3 Entity Framework - Varbinary

Employee.

Ich habe eine gespeicherte Prozedur erstellt, die wie dieses

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 

sieht Der Grund, warum ich eine gespeicherte Prozedur erstellt haben, ist einige der varbinary Spalten in der Tabelle in Strings konvertieren und mit EF in MVC3 zu verwenden.

Die Art, wie ich die Prozedur im Modell abgebildet habe, ist wie folgt.

FunctionImport1 into Model(EF)

FunctionImport2 into Model(EF)

In meinem EmployeeViewModel dieser die Art, wie ich die Eigenschaften Felder abgebildet am

[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; } 
} 

In Zugriff auf die gespeicherte Prozedur in meinem Service-Methode, das ist die Art, wie ich Ich greife darauf zu.

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

ERROR in dieser Methode:

Die 'EncryptFirstname' Eigenschaft auf 'Mitarbeiter' zu einem nicht festgelegt werden konnte Wert 'String'. Sie müssen diese Eigenschaft auf einen Nicht-Null-Wert vom Typ 'Byte []' festlegen.

In meiner gespeicherten Prozedur, wenn ich einfach die EncryptFirstname anzuzeigen bin, wie es islike, mit heraus zu bespannen Umwandlung, tritt kein Fehler auf, aber der Wert I ist system.byte[] bekommen wird.

Aber es muss im String Format sein, so dass ich verstehen kann, welchen Wert es ist?

Bitte beraten, was ich tun soll, um es richtig anzuzeigen.

So wandle ich die Entität in entityViewmodel um.

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

    var evm = new EmployeeViewModel(); 

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

    return evm; 
} 
+0

Das ist genau das gleiche Problem, das ich auch habe. Ich weiß, das ist ein älterer Beitrag, aber hast du jemals eine Lösung gefunden? Ich habe versucht, das für einen guten Teil des Tages herauszufinden. – TheAmazingJason

Antwort

0

fand ich diese article sehr hilfreich sein und ich fand die Antwort in der „die Typen importieren Stored Procedures Andere als Entities Return“ Abschnitt mit dem Titel. Also die Lösung ist in Ihrem letzten Screenshot oben, wo Sie in der Dialogbox "Add Function Import" sind, anstatt das Optionsfeld Entities auszuwählen, klicken Sie zuerst auf "Get Column Information" und dann auf "Create New Complex Type" Taste. Jetzt können Sie zurück gehen und das Optionsfeld "Komplex" auswählen und diesen neuen Typ aus dem Dropdown auswählen. Jetzt können Sie einfach Ihre Ansicht einstellen, um dieses Modell zu verwenden, und Sie werden alles haben.

Verwandte Themen