2013-02-04 29 views
9

Tôi đang làm việc với dự án EF Code First, và tất cả đều tốt. Tôi có một lớp, khách hàng đơn giản. Trong lớp khách hàng của tôi, tôi có một lĩnh vực tôi muốn mã hóa (Có, tôi biết tôi có thể mã hóa ở cấp DB nhưng yêu cầu dictate tôi mã hóa ở cấp Domain/Mã), vì vậy tôi hy vọng rằng tôi có thể làm một cái gì đó như sau:Mã khuôn khổ thực thể Đầu tiên, trình rút gọn hoặc getter không?

public class Customer 
{ 
    public int CustomerID { get; set; }  
    public string FieldToEncrypt { get; set { _FieldToEncrypt = MyEncryptionFunction.Encrypt(); } } 
} 

Tuy nhiên, tôi giả định rằng nếu setter có định nghĩa, mã khung thực thể đầu tiên có thể bỏ qua thuộc tính đó khi tạo giản đồ. Vì vậy, câu hỏi của tôi là, có cách nào để làm Mã EF đầu tiên với cung cấp getters/setters, hoặc tôi nên di chuyển chức năng này vào một nhà xây dựng? Tôi có nên ghi đè lên một trong các phương pháp/sự kiện xảy ra khi bối cảnh đang lưu thay vào đó không?

EDIT * ** * ** * ** * ** * ** * ****

Là một lưu ý, tôi đang sử dụng DataService để truyền dữ liệu qua dịch vụ giao thức OData. Điều này sẽ tự động tạo ra các phương thức chèn/cập nhật/chọn. Một số gợi ý yêu cầu tạo thuộc tính thứ hai, nhưng lớp DataService dường như không truyền qua các thuộc tính NotMapped. Điều này ném một chút của một kink vào câu hỏi trước đó của tôi.

+0

Nếu bạn đang thực hiện mã hóa trên một chuỗi, tôi khuyên bạn nên đặt mã này ở gần đầu vào nhất có thể. tức là bạn làm gì 'FieldToEncrypt =" asdf ";' (mã hóa được xử lý trong setter), thay đổi thành 'FieldToEncrypt = MyEncryptionFunction.Encrypt (" asdf ");' –

+2

Bạn đã thử chưa? Có một số câu trả lời tương tự trên SO cho thấy rằng điều này hoạt động ra khỏi hộp theo cách bạn đang tìm kiếm. Xem http://stackoverflow.com/questions/11962532/what-does-entityframework-code-first-do-with-property-getters-setters và http://stackoverflow.com/questions/8990319/have-a-custom -setter-on-property-for-ef-code-first-model-entity- – Zeph

+0

Liên kết thứ hai bạn cung cấp dường như gần hơn với những gì tôi cần. Tuy nhiên, anh ấy đang nói về 'không lập bản đồ' trường. Tôi muốn lĩnh vực được lập bản đồ, vẫn còn. Tôi chỉ muốn giá trị được ánh xạ được chuyển đổi trước khi giá trị bị mắc kẹt trong cơ sở dữ liệu. Tôi đoán tôi có một câu hỏi sâu hơn, và đó là: Trong EF Code Đầu tiên, mã có gọi là getters và setters trước/sau khi chèn không? – Richthofen

Trả lời

4
public class Customer 
{ 
    public int CustomerID { get; set; }   
    public string EncryptedField { get; private set; } 

    [NotMapped] 
    public string Field 
    { 
     get { return MyEncryptionFunction.Decrypt(EncryptedField); } 
     set { EncryptedField = MyEncryptionFunction.Encrypt(value); } 
    } 
} 
+0

Ok, nhưng tôi đang cố gắng tìm ra GET và SET. Vì vậy, khi Entity Framework cố gắng ghi dữ liệu vào cơ sở dữ liệu, nó có gọi là 'GET' trên đối tượng không? Nếu vậy, dữ liệu trong cơ sở dữ liệu sẽ được giải mã sau đó được chèn vào cơ sở dữ liệu. Trong ví dụ này, tôi lo lắng dữ liệu chỉ được mã hóa trong bộ nhớ chứ không phải khi được duy trì. Tôi đã thử tuyên bố SET và nó làm việc đáng ngạc nhiên chính xác như thế nào tôi muốn nó. Chú thích 'NotMapped' cung cấp những gì? Liệu nó có nói với khung công tác * không * tồn tại cột đó trong db không? nếu có, nó sẽ không hoạt động cho ví dụ của tôi. – Richthofen

+0

Trong mẫu này, bạn sẽ chỉ có hai cột trong cơ sở dữ liệu: CustomerID và EncryptedField (với giá trị trường được mã hóa). Dữ liệu không được mã hóa sẽ không được lưu trữ ở bất cứ đâu - không phải trong cơ sở dữ liệu, cũng như trong bộ nhớ. Chú thích 'NotMapped' cho EF bỏ qua thuộc tính và không tạo cột trong cơ sở dữ liệu cho thuộc tính này –

+0

Ok. Nhưng thay vì tách nó thành hai trường, một trường không được ánh xạ và một ánh xạ, tôi có thể làm điều này với một trường, ánh xạ không? – Richthofen

Các vấn đề liên quan