2012-02-26 17 views
6

Một trong các lớp thực thể của tôi có thể lưu trữ trong máy chủ sql cơ sở dữ liệu dưới dạng BIGINT. Câu hỏi của tôi là: Làm thế nào để có được bối cảnhEntity Framework để biết cách lưu trữ và truy xuất các cá thể của lớp thực thể của tôi?Cách phân biệt khung thực thể cách lưu các phiên bản của loại tùy chỉnh (có thể được lưu trữ dưới dạng vô hướng)

Thêm chi tiết. Tôi đang sử dụng Noda Time, có thể đại diện cho một phạm vi rộng hơn (nhiều) là ngày so với thời gian có thể là SQL hoặc .NET (và đó là một món tráng miệng cao cấp). Lớp thực thể của tôi, Happening, là một trình bao bọc xung quanh lớp học của NodaTime. Tôi có thể đặt Xảy ra từ một thời gian dài, và nhận được một thời gian dài từ một sự kiện xảy ra với các phương thức như .SetFromLong (tức thì) và .ToLong().

Hiện tại tôi có mô hình của mình đang hoạt động, lưu các lớp có chứa thuộc tính của loại chấm DateTime. Nếu thay vào đó, tôi muốn sử dụng các thuộc tính loại tùy chỉnh "Xảy ra" của tôi, làm cách nào để tôi nói cho Khung thực thể biết cách lưu các thuộc tính đó?

Nếu tôi đang đọc bài viết này về Lập mô hình và lập bản đồ, tôi có trên đường ray bên phải hoặc thiếu thứ gì đó đơn giản hơn không?

http://msdn.microsoft.com/en-us/library/bb896343.aspx

Tôi đang sử dụng Entity Framework 4.

+0

trùng lặp: http://stackoverflow.com/questions/5820915/entity-framework-custom-data-type-mapping –

Trả lời

6

gì tôi khuyên bạn nên làm là thêm 2 thuộc tính trên đơn vị của bạn một NodaTime và dài, và không bao gồm bất động sản NodaTime bạn sử dụng [NotMapped] tại EF của bạn mô hình, sau đó trong getter/setter của bạn cập nhật lâu dài.

tức

public class MyEntity{ 
    public long TimeAsLong{get;set;} 
    [NotMapped] 
    public Happening { 
     get{ 
     return new Happening().SetFromLong(TimeAsLong); 
     } 
     set { 
     TimeAsLong = value.ToLong(); 
     } 
    } 
} 

Hiệu quả của việc này sẽ là dài được lưu trữ trong db nhưng bạn có thể truy cập nó trên lớp qua NodaTime

+1

Điều đó có hiệu quả, cảm ơn bạn. Tôi không cần TimeAsLong ngoại trừ để thích ứng với EF, điều đó có xuất hiện nhiều không, và (theo kinh nghiệm của bạn) bạn có cố gắng đặt tên cho những thành viên đó một cách rõ ràng, TimeAsLongForEF, bất cứ thứ gì như thế không? –

+0

Tất cả về lưu trữ so với bản trình bày, đôi khi tốt hơn/hiệu quả hơn để lưu trữ thứ gì đó khác với cách bạn muốn sử dụng, đây là một ví dụ. Không có đống địa điểm ive được tìm thấy nơi tôi cần phải làm điều này nhưng nó xảy ra vào dịp khác, ví dụ khác được tìm thấy là lưu trữ một Char duy nhất trong cơ sở dữ liệu yêu cầu chuyển đổi nó thành chuỗi trong mô hình viết của bạn (EF không phân biệt giữa varchar [1] và varchar [2] chúng đều là chuỗi). Cá nhân tôi sẽ không dán nhãn trường như EF nhưng đó chỉ là một điều ưu tiên. –

+0

Cũng lưu ý rằng EF không thực sự quan tâm nếu tính thích hợp là công khai hay không (nếu bạn tình cờ sử dụng Code First). Mặc dù bạn vẫn cần một số cách để ánh xạ nó ngay cả khi nó là riêng tư. Những gì chúng tôi đã làm, chúng tôi đặt lớp cấu hình EF trong lớp thực thể để nó có thể truy cập vào các trường riêng tư và thực hiện ánh xạ. Hạn chế là bạn có lớp ánh xạ trong thực thể của bạn mà bạn có thể hoặc có thể không có vấn đề gì. –

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