Entity Framework Core 2.0, сопоставление перечисления с tinyint в SQL Server, вызывает исключение по запросу - PullRequest
0 голосов
/ 11 мая 2018

Я получаю следующее исключение при попытке сопоставить enum с smallint в OnModelCreating:

InvalidCastException: Невозможно привести объект типа 'System.Byte' к типу'System.Int32'.

Я хочу сделать это, потому что в SQL Server int равен 4 байта, а tinyint равен 1 байту.

Соответствующий код: 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);
        }
    }
}

Запрос:

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

Есть ли способ, которым я могу сделать эту работу, чтобы мне не пришлось использоватьВ 4 раза больше места со всеми моими enum с?

1 Ответ

0 голосов
/ 11 мая 2018

Базовый тип перечисления и тип столбца должны быть одинаковыми.Начните с изменения базового типа для вашего перечисления:

public enum TagType: byte

И вам нужно удалить

... .HasColumnType("smallint");

, тогда столбец будет автоматически tinyint или установить его вручную:

.HasColumnType("tinyint"); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...