Моя устаревшая база данных SQL Server хранит логические значения как целые числа.
Я знаю, как настроить это преобразование. И это работает в простых запросах, таких как:
var query = db.TableChild.Select(a => new { a.BoolField }).ToList();
Но при выполнении запроса с отношением один к одному произошло исключение:
System.InvalidOperationException: Исключение произошло при чтении значения базы данных. Ожидаемый тип был «System.Boolean», но фактическое значение имело тип «System.Int32». ---> System.InvalidCastException: невозможно привести объект типа «System.Int32» к типу «System.Boolean».
Если я изменяю отношение к соединению таблиц или использую Include, все работает нормально, типы преобразуются.
Неверный запрос с исключением:
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")