C# 实体框架核心3.1-Oracle“;指定的强制转换无效”;

C# 实体框架核心3.1-Oracle“;指定的强制转换无效”;,c#,entity-framework,linq,.net-core,entity-framework-core,C#,Entity Framework,Linq,.net Core,Entity Framework Core,在我的.NET Core 3.1应用程序中,我使用linq通过以下语句从视图中获取条目列表: List<VEntries> entryList = dbContext.VEntries.Where(x => x.Timestamp.HasValue && x.Timestamp.Value.Date == dateTimeLocal.Date &&

在我的.NET Core 3.1应用程序中,我使用linq通过以下语句从视图中获取条目列表:

List<VEntries> entryList = dbContext.VEntries.Where(x => x.Timestamp.HasValue && 
                                            x.Timestamp.Value.Date == dateTimeLocal.Date && 
                                            x.Timestamp.Value.Hour == dateTimeLocal.Hour)
                                .ToList();

这里可能有什么问题?

根据您发布的错误,我认为错误与
日期时间
字段无关,而是与
十进制
字段有关:

位于Oracle.ManagedDataAccess.Client.OracleDataReader.GetDecimal(Int32 i)

Oracle的
数字
范围大于C#
十进制
,因此它可能无法将生产数据库中读取的一个非常大的数字转换为您的应用程序。我敢打赌,在本地工作是因为在您的本地数据库中,您没有任何大的数字

可能的解决办法:

  • 在生产数据库中截断或舍入小数(如果有)
  • 如果第一种选择不可行,您可以尝试为
    VEntries
    中的十进制值添加一个
    ValueConverter
    ,该转换器可以将
    double
    (精度较低但范围较大)转换为
    decimal
    (精度较高,范围较小),反之亦然
  • 我没有试过,但应该是这样的:

    public partial class VEntries
    {
        public string QualityData { get; set; }
        public decimal? Value { get; set; }
        public DateTime? Timestamp { get; set; }
        public decimal? Average { get; set; }
        public decimal? Min { get; set; }
        public decimal? Max { get; set; }
    }
    
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder
            .Entity<VEntries>()
            .Property(e => e. Value)
            .HasConversion(
                decimalValue => (double)decimalValue,
                doubleValue => (decimal)doubleValue);
           // Repeat for all decimal values
    }
    
    模型创建时受保护的覆盖无效(ModelBuilder ModelBuilder)
    {
    建模者
    .实体()
    .属性(e=>e.值)
    .哈斯转换(
    小数点=>(双)小数点,
    doubleValue=>(十进制)doubleValue);
    //对所有十进制值重复此操作
    }
    
    能否发布
    entryData
    的代码以及所涉及的实体/视图的配置?@dglozano entryData只是dbContext.VEntries。我相应地修改了问题。非常感谢!这正是导致生产环境中出现错误的原因。我认为oracle数据提供程序没有考虑到这一点是一个很大的陷阱。@Chris很高兴您能够解决它选项1,因为我们可以访问生产数据库,因此可以在视图中对小数进行四舍五入。