【问题标题】:Entity Framework: nullable DateTime toString(format) in vb.net handling实体框架:vb.net 处理中可为空的 DateTime toString(format)
【发布时间】:2013-07-28 22:49:27
【问题描述】:

给定一个带有 DateTime 字段生日(非空)的表格元素,在实体框架 4 中我可以这样做:

Dim mylist = (From el in Element Select el).ToList()
     .Select(function(el) new with { 
           .bday = el.birthday.toString("dd/MM/yy") 
           }

我现在需要将生日更改为可为空,因此我更改了 SQL Server 中的表,然后在 Visual Studio 中更新了我的 ModelDB。 结果是这一行:

           .bday = el.birthday.toString("dd/MM/yy") 

引发异常为“从整数到字符串“dd/mm/yy”的无效转换)。 让它“固定”的唯一方法是这样改变这条线:

           .bday = CDate(el.birthday).toString("dd/MM/yy") 

这是正确的方法吗? 既然我有了一个可以为空的Datetime,那么el.birthday为null的情况如何处理?

谢谢!

【问题讨论】:

    标签: vb.net datetime entity-framework-4.1


    【解决方案1】:

    如果你做一个小实验,你会完全理解发生了什么:

    Dim normalDate As Date = Now
    Dim nullableDate As Nullable(Of Date) = normalDate
    
    Dim normalToText As String = normalDate.ToString("dd/MM/yy") 'Works perfectly
    
    Dim nullableToText As String = nullableDate.ToString("dd/MM/yy") 'Error
    

    normalDatenullableDate 两个变量中的内容相同,但它们不同:ToString("date in certain format") 功能需要 Date 类型作为输入;您发送的是 Date 类型的修改版本(差别不大,但也不相同)。使用CDate,您所做的是将修改后的 Date 版本转换为实际有效的 Date 类型,因此 ToString() 功能可以正常工作。

    你做对了吗?是的,就 CDate 可以处理“空值”而言(CDate(Nothing) 不输出任何错误):您正在使给定变量适应 ToString() 的预期。

    注意:我已经检查了上面代码输出的确切错误,它有效地提供了“从字符串“dd/MM/yy”到类型“整数”的转换无效。”。因此,当您打算将 ToString("date") 与 Nullable Date 一起使用时,您得到的错误是标准错误;不是太描述错误,这是真的。

    【讨论】:

    • 实际上我无法理解为什么错误与整数有关,因为在数据库中该字段是日期时间(永远不要更改)。无论如何,在 el.birthday 空元素上调用 CDate(el.birthday) 时出现错误,但我会写几行代码来解决这个问题..
    • @Desmond 我现在已经更新了我的答案:如果你试一试......抓住周围的 Dim nullableToText As String = nullableDate.ToString("dd/MM/yy"),你会看到您得到的错误是您报告的错误。该错误不是太具有描述性,但在使用此方法和可空日期时是标准错误,因此您的输入数据没有任何问题。
    【解决方案2】:

    在处理可为空的属性时,db 列映射到 System.Nullable(Of T) (See Documentation)。因此,在您的情况下,el.birthday 应该已映射到 Nullable(Of DateTime)。这个类有两个属性来处理你遇到的情况,即.ValueDoc)和.HasValueDoc)。

    实际的类型特定值存储在.Value,所以在你的情况下,你需要做这样的事情:

    .bday = el.birthday.value.toString("dd/MM/yy") 
    

    或者您可以使用 .HasValue 返回布尔值来指示是否有值:

    If el.birthday.HasValue Then
       .bday = el.birthday.toString("dd/MM/yy") 
    End If
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-22
      • 2012-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-13
      相关资源
      最近更新 更多