10

I get the following exception when I try to map an enum to smallint in OnModelCreating:

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

I want to do this because in SQL Server an int is 4 bytes while a tinyint is 1 byte.

Relevant code: Entity:

namespace SOMapping.Data
{
    public class Tag
    {
        public int Id { get; set; }

        public TagType TagType { get; set; }
    }

    public enum TagType
    {
        Foo,
        Bar
    }
}

DbContext:

using Microsoft.AspNetCore.Identity.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore;

namespace SOMapping.Data
{
    public class ApplicationDbContext : IdentityDbContext
    {
        public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
            : base(options)
        {
        }

        public DbSet<Tag> Tags { get; set; }

        protected override void OnModelCreating(ModelBuilder builder)
        {
            builder.Entity<Tag>().Property(m => m.TagType).HasColumnType("smallint");

            base.OnModelCreating(builder);
        }
    }
}

Query:

using System.Linq;
using Microsoft.AspNetCore.Mvc;
using SOMapping.Data;

namespace SOMapping.Controllers
{
    public class HomeController : Controller
    {
        private ApplicationDbContext _applicationDbContext;

        public HomeController(ApplicationDbContext applicationDbContext)
        {
            _applicationDbContext = applicationDbContext;
        }

        public IActionResult Index()
        {
            var tags = _applicationDbContext.Tags.ToArray();
            return View();
        }
    }
}

Is there a way I can make this work so that I don't have to use 4 times as much space with all my enums?

1 Answer 1

22

Base type of enum and type of column must be same. Start from changing base type for your enum:

public enum TagType: byte

And your need remove

... .HasColumnType("smallint");

then column would be automaticaly tinyint, or set it manualy:

.HasColumnType("tinyint"); 
Sign up to request clarification or add additional context in comments.

1 Comment

You rock!! Thank you. The perils of working against inMemoryDatabase. Lotta refactoring to do

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.