Тип столбца теряется только при использовании отношения один к одному - PullRequest
1 голос
/ 28 марта 2019

Моя старая база данных SQL Server хранит значения bool как целые числа.

Я знаю, как настроить это преобразование. И это работает в простых запросах, таких как:

var query = db.TableChild.Select(a => new { a.BoolField }).ToList();

Но при выполнении запроса с отношением один к одному произошло исключение:

System.InvalidOperationException: исключение произошло при чтении значения базы данных. Ожидаемый тип был System.Boolean, но фактическое значение было типа System.Int32. ---> System.InvalidCastException: невозможно преобразовать объект типа 'System.Int32' в тип 'System.Boolean'.

Если я меняю отношение к объединению таблиц или использую «Включить», все работает нормально, типы конвертируются.

Неверный запрос за исключением:

var query = db.TableParent
    .Where(a => a.Child != null)
    .Select(a => new { a.Child.BoolField })
    .ToList();

Отношение создается как:

entityTypeChild
    .HasOne(b => b.Parent)
    .WithOne(a => a.Child)
    .HasForeignKey<TableChild>(b => b.ParentRefId)
    .HasPrincipalKey<TableParent>(a => a.RefId);

Таблицы отображаются как:

class TableParent
{
    [Key]
    public long Id { get; set; }
    [Required]
    public string RefId { get; set; }

    public TableChild Child { get; set; }
}

class TableChild
{
    [Key]
    public long Id { get; set; }
    [Required]
    public string ParentRefId { get; set; }
    [Column(TypeName = "int")]
    public bool BoolField { get; set; }

    public TableParent Parent { get; set; }
}

Производится SQL нормально:

SELECT [a.Child].[BoolField]
FROM [TableParent] AS [a]
LEFT JOIN [TableChild] AS [a.Child] ON [a].[RefId] = [a.Child].[ParentRefId]
WHERE [a.Child].[Id] IS NOT NULL

Я ожидаю, что этот запрос linq будет работать без исключений и не игнорировать Column(TypeName = "int") атрибут

...