2012-04-16 30 views
17

Chúng tôi đã sử dụng EF CF một lúc trong giải pháp của chúng tôi. Người hâm mộ lớn! Đến thời điểm này, chúng tôi đã sử dụng một hack để hỗ trợ enums (tạo ra một trường bổ sung trên mô hình; bỏ qua ánh xạ enum durring; và ánh xạ trường bổ sung vào cột trong db mà chúng ta đã sử dụng). Theo truyền thống, chúng tôi đã lưu trữ enums của chúng tôi như chuỗi (varchars) trong DB (làm cho nó tốt đẹp và dễ đọc). Bây giờ với sự hỗ trợ enum trong EF 5 (Beta 2) có vẻ như nó chỉ hỗ trợ ánh xạ enums để int cột trong DB .... Chúng ta có thể nhận được EF 5 để lưu trữ enums của chúng tôi như là đại diện chuỗi của họ.Tôi có thể lưu trữ enums dưới dạng chuỗi trong EF 5 không?

đâu "Loại" là một enum loại DocumentType

public enum DocumentType 
    { 
     POInvoice, 
     NonPOInvoice, 
     Any 
    } 

tôi đã cố gắng để ánh xạ nó sử dụng:

public class WorkflowMap : EntityTypeConfiguration<Model.Workflow.Workflow> 
    { 
     public WorkflowMap() 
     { 
      ToTable("Workflow", "Workflow"); 
      ... 
      Property(wf => wf.Type).HasColumnType("varchar"); 

     } 
    } 

tôi nghĩ là sẽ là viên đạn ma thuật nhưng ..

Điều đó chỉ cần ném:

Sch ema được chỉ định không hợp lệ. Lỗi: (571,12): lỗi 2019: Thành viên Ánh xạ được chỉ định không hợp lệ. Loại 'Dodson.Data.DataAccess.EFRepositories.DocumentType [Nullable = False, DefaultValue =]' của thành viên 'Loại' trong loại 'Dodson.Data.DataAccess.EFRepositories.Workflow' là không tương thích với 'SQLServer .varchar [Nullable = False, DefaultValue =, MaxLength = 8000, Unicode = False, FixedLength = False] ' của thành viên' Loại 'trong loại' CodeFirstDatabaseSchema.Workflow '.

Suy nghĩ của bạn?

Trả lời

16

Hiện tại, điều này là không thể. Enum trong EF có những hạn chế giống như enums trong CLR - chúng chỉ được đặt tên là các giá trị số nguyên. Kiểm tra this article để xác nhận:

Định nghĩa loại enum EF nằm trong lớp khái niệm. Tương tự như CLR enums enums EF có loại cơ bản đó là một trong Edm.SByte, Edm.Byte, Edm.Int16, Edm.Int32 hoặc Edm.Int64 với Edm.Int32 là loại cơ bản mặc định nếu không có được chỉ định .

Tôi đã đăng articlerelated suggestion về sự cố này. Nếu bạn muốn xem tính năng này trong tương lai, vui lòng bỏ phiếu cho đề xuất này.

11

Tôi đã gặp sự cố này vài tuần trước. Điều tốt nhất tôi có thể nghĩ ra là một chút hacky.

Tôi có enum Giới tính trên lớp Người và tôi sử dụng chú thích dữ liệu để ánh xạ chuỗi đó tới cơ sở dữ liệu và bỏ qua enum.

public class Person 
{ 
    public int PersonID { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 

    [Column("Gender")] 
    public string GenderString 
    { 
     get { return Gender.ToString(); } 
     private set { Gender = value.ParseEnum<Gender>(); } 
    } 

    [NotMapped] 
    public Gender Gender { get; set; } 
} 

Và phương pháp mở rộng để lấy đúng enum từ chuỗi.

public static class StringExtensions 
{ 
    public static T ParseEnum<T>(this string value) 
    { 
     return (T)Enum.Parse(typeof(T), value, true); 
    } 
} 

Xem bài đăng này để biết chi tiết đầy đủ - http://nodogmablog.bryanhogan.net/2014/11/saving-enums-as-strings-with-entity-framework/

+0

Đây thực sự là hoạt động nhưng một chút hacky. –

+0

Đó là. Có lẽ EF 7 sẽ có thứ gì đó. – Bryan

+0

Giải pháp tốt.Một chút bình luận, một khi bạn sử dụng một phương pháp mở rộng, bạn có thể viết đơn giản - giá trị.ParseEnum (), thay vì EnumExtensions.ParseEnum (giá trị). – IFink

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