我的旧版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")
属性