Hasconversin Enum

Yitong Phou 21 Reputation points
2022-05-14T04:27:31.097+00:00

I am trying to do Enum conversion in my dataContext. However, it always give me

System.InvalidCastException: 'Unable to cast object of type 'System.Int32' to type 'System.String'.'

 var converter = new EnumToStringConverter<Role>();

            modelBuilder.Entity<Account>()
                .Property(e => e.Role)
                .HasConversion(converter);

or
 var converter = new EnumToStringConverter<Role>();

            modelBuilder.Entity<Account>()
                .HasConversion(
                    v => v.ToString(),
                    v => (Role)Enum.Parse(typeof(Role), v));

.........
Enum field in models
........
public Role Role { get; set; }

namespace Project1.Models
{
    public enum Role
    {
         Admin = 0,
         User = 1
    }
}
Entity Framework Core
Entity Framework Core
A lightweight, extensible, open-source, and cross-platform version of the Entity Framework data access technology.
689 questions
{count} votes

1 answer

Sort by: Most helpful
  1. Karen Payne MVP 35,016 Reputation points
    2022-05-22T13:19:29.82+00:00

    I have a code sample.

    • Class project
    • Console project
    • T4 template, not part of the question but is useful for new enum members stored in a database

    Model

    public partial class Book  
    {  
        public int BookId { get; set; }  
        public string Title { get; set; }  
        public int BookCategory { get; set; }  
    }  
    

    BookCategory

    public enum BookCategory  
    {  
        SpaceTravel = 1,  
        Adventure = 2,  
        Romance = 3,  
        Sports = 4,  
        Automobile = 5  
    }  
    

    HasConversion

    protected override void OnModelCreating(ModelBuilder modelBuilder)  
    {  
        modelBuilder.HasAnnotation("Relational:Collation", "SQL_Latin1_General_CP1_CI_AS");  
      
        // Value converter for enum  
        modelBuilder  
            .Entity<Book>()  
            .Property(e => e.BookCategory)  
            .HasConversion(item => item,   
                item => (int)Enum.Parse(typeof(BookCategory),   
                    item.ToString()));  
      
        modelBuilder.HasSequence<int>("seq_test").HasMin(1);  
      
        OnModelCreatingPartial(modelBuilder);  
    }  
    

    Console app

    namespace EntityFrameworkEnumSimpleApp  
    {  
        class Program  
        {  
            static void Main(string[] args)  
            {  
                using (var context = new BookContext())  
                {  
                    AddRecords(context);  
                    ShowRecords(context);  
                }  
                  
                Console.ReadLine();  
            }  
      
            private static void ShowRecords(BookContext context)  
            {  
                var table = new Table()  
                    .RoundedBorder()  
                    .AddColumn("[b]Id[/]")  
                    .AddColumn("[b]Title[/]")  
                    .AddColumn("[b]Category[/]")  
                    .Alignment(Justify.Center)  
                    .BorderColor(Color.LightSlateGrey)  
                    .Title("[yellow]Books[/]");  
      
                var books = context.Book.ToList();  
      
                foreach (var book in books)  
                {  
                    table.AddRow(book.BookId.ToString(), book.Title, Enum.GetName(typeof(BookCategory), book.BookCategory)!);  
                }  
      
                AnsiConsole.Write(table);  
            }  
      
            private static void AddRecords(BookContext context)  
            {  
                if (context.Book.ToList().Count == 0)  
                {  
                    List<Book> list = new()  
                    {  
                        new() { BookCategory = 5, Title = "First book" },  
                        new() { BookCategory = 3, Title = "Second book" },  
                        new() { BookCategory = 1, Title = "Third book" }  
                    };  
      
                    context.AddRange(list);  
                    Console.WriteLine($"Books saved {context.SaveChanges()}");  
                }  
            }  
      
            [ModuleInitializer]  
            public static void Init()  
            {  
                Console.Title = $"EF Core enums simple";  
            }  
        }  
    }  
      
    

    Results

    204392-bookcategory.png