Skip to content

System.InvalidCastException when using Enum : short #303

Open

Description

@IgoR-NiK

DO 6.0.11

System.InvalidCastException when using Enum : short

using NUnit.Framework;
using Xtensive.Orm;
using Xtensive.Orm.Configuration;

var dc = new DomainConfiguration("sqlserver", "Data Source=.; Initial Catalog=EnumShortBug; Integrated Security=True;");

dc.UpgradeMode = DomainUpgradeMode.Recreate;

dc.Types.Register(typeof(TestEntity));

using (var domain = Domain.Build(dc))
using (var s = domain.OpenSession())
using (s.Activate())
using (var t = Session.Current.OpenTransaction())
{
    new TestEntity(1);

    // OK
    Assert.DoesNotThrow(
        () => Query.All<TestEntity>()
                    .Select(it => new { it.Id, EnumInt = EnumInt.Usd })
                    .GroupBy(it => it.EnumInt, it => new { it.Id, it.EnumInt })
                    .ToList());

    // FAIL
    Assert.DoesNotThrow(
        () => Query.All<TestEntity>()
                    .Select(it => new { it.Id, EnumShort = EnumShort.Usd })
                    .GroupBy(it => it.EnumShort, it => new { it.Id, it.EnumShort })
                    .ToList());

    t.Complete();
}

enum EnumInt
{
    Rub = 1,

    Usd = 2
}

enum EnumShort : short
{
    Rub = 1,

    Usd = 2
}

[HierarchyRoot]
class TestEntity : Entity
{
    public TestEntity(int id) : base(id)
    {
    }

    [Key]
    [Field]
    public int Id { get; set; }
}

Exception

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

at System.Data.SqlClient.SqlBuffer.get_Int16()
at System.Data.SqlClient.SqlDataReader.GetInt16(Int32 i)
at Xtensive.Sql.TypeMapper.ReadShort(DbDataReader reader, Int32 index)
at Xtensive.Sql.TypeMapping.ReadValue(DbDataReader reader, Int32 index)
at Xtensive.Orm.Providers.DbDataReaderAccessor.Read(DbDataReader source)
at Xtensive.Orm.Providers.Command.ReadTupleWith(DbDataReaderAccessor accessor)
at Xtensive.Orm.Providers.Command.<AsReaderOf>d__19.MoveNext()
at Xtensive.Orm.Providers.SqlSessionHandler.<Xtensive-Orm-Providers-IProviderExecutor-ExecuteTupleReader>d__51.MoveNext()
at Xtensive.Orm.Providers.SqlProvider.<OnEnumerate>d__12.MoveNext()
at Xtensive.Orm.Rse.Providers.ExecutableProvider.<GetEnumerator>d__12.MoveNext()
at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
at Xtensive.Orm.Rse.RecordSet.<GetGreedyEnumerator>d__12.MoveNext()
at System.Linq.Enumerable.SelectEnumerableIterator`2.MoveNext()
at Xtensive.Core.EnumerableExtensions.<Batch>d__22`1.MoveNext()
at Xtensive.Core.EnumerableExtensions.<ApplyBeforeAndAfter>d__25`1.MoveNext()
at System.Linq.Enumerable.SelectManySingleSelectorIterator`2.MoveNext()
at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
at Program.<>c.<<Main>$>b__0_1() in C:\EnumShortBug\EnumShortBug\Program.cs:line 27
at System.Reflection.MethodInvoker.Invoke(Object obj, IntPtr* args, BindingFlags invokeAttr)

Activity

  1. self-assigned this
    on Mar 9, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions