2017-10-23 1 views
1

Das ThirdParty Modell enthält eine Eigenschaft Certificate. Es ist ein Datentyp von X509Certificate2 für die Verwendung von Quellcode, aber EFCore unterstützt es nicht, was bedeutet, dass ich es in Base64 string für EFCore-Datenbankspeicher konvertieren muss. Dann wandeln Sie es beim Lesen aus der EFCore-Datenbank zurück in X509Certificate2.CodeFirst-Eigenschaft in Base64-Zeichenfolge in EFCore speichern, aber X509Certificate2 von EFCore zurücklesen?

Wie weisen wir EFCore an, dies automatisch mit jedem Property Mapper zu tun?

public class ThirdParty 
{ 
    public Guid ThirdPartyId { get; set; } 
    public X509Certificate2 Certificate { get; set; } 
    public string RawData { get; set; } 
    public DateTime CreatedDate { get; set; } 
} 

var certificate1 = new X509Certificate(); 
var thirdParty = new ThirdParty() { Certificate = certificate } 
var certificate2 = thirdParty.Certificate; 

Antwort

1

Ein Ansatz wäre eine zusätzliche nicht abgebildet Eigenschaft hinzufügen, die das X509Certificate2 Objekt zurück, die aus den Base64string erstellt werden, die aus der Datenbank gelesen wurden. Daher wird die CertificateString -Eigenschaft nur zum Speichern und Lesen von Datenkontext verwendet und die Certificate -Eigenschaft dient zur Verwendung in Ihrer anderen Logik.

public class ThirdParty 
{ 
    private X509Certificate2 _certificate; 



    public Guid ThirdPartyId { get; set; } 

    // to write in data context only - only set it in production code 
    public string CertificateString 
    { 
     get 
     { 
      // return the Base64 string - is just pseudo code 
      return _certificate?.ToString(); 
     }  
     set 
     { 
      _certificate = new X509Certificate2(value); 
     } 
    } 

    // not mapped for data context - to read from data context only - only read fro 
    public X509Certificate2 Certificate 
    { 
     get 
     { 
      if (string.IsNullOrWhiteSpace(CertificateString)) 
      { 
       return default(X509Certificate2); 
      } 

      return new X509Certificate2(CertificateString); 
     }  
     private set 
     { 
      // will be set by CertificateString 
     } 
    } 

    public string RawData { get; set; } 

    public DateTime CreatedDate { get; set; } 
} 

Um eine Eigenschaft nicht zuordnen Sie [NotMapped] als Daten Annotation oder .Ignore(p => p.PropertyName) in Fluent API nutzen könnten.

+0

Ich habe den Beitrag oben durch Hinzufügen von 3 weiteren Zeilen am unteren Rand aktualisiert. Ich habe versucht, herauszufinden, wie man es funktioniert, indem ich es andersherum mache, aber es nicht zum Laufen bringen konnte. : -/ – fletchsod

+0

Welche Ausnahmen erhalten Sie? – ChW

+0

Scratch das. Habe das Problem gefunden, der Debugger verhält sich seltsam, wenn ich 'new X509Certificate2()' mache. Ich akzeptiere deine Antwort trotzdem. – fletchsod

Verwandte Themen