Моя старая база данных 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")
атрибут