仅当使用一对一关系时

时间:2019-03-28 15:22:58

标签: c# entity-framework-core ef-core-2.2

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

0 个答案:

没有答案