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 enum
s?
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");
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With