实体框架Core 2.0将枚举枚举到SQL Server中的tinyint会在查询

时间:2018-05-11 17:11:43

标签: c# entity-framework-core

当我尝试将enum映射到smallint中的OnModelCreating时,我收到以下异常:

  

InvalidCastException:无法将类型为“System.Byte”的对象强制转换为“System.Int32”。

我想这样做,因为在SQL Server中,int为4个字节,而tinyint为1个字节。

相关代码: 实体:

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);
        }
    }
}

查询:

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();
        }
    }
}

我有没有办法让这项工作成功,以便我不需要使用所有enum的4倍空间?

1 个答案:

答案 0 :(得分:9)

枚举的基本类型和列的类型必须相同。 从更改枚举的基本类型开始:

public enum TagType: byte

你需要删除

... .HasColumnType("smallint");

然后列将是automaticaly tinyint,或者设置为manualy:

.HasColumnType("tinyint");