使用dbml将数据库值映射到TimeSpan

时间:2009-05-12 11:25:57

标签: sql-server linq linq-to-sql timespan

我需要在数据库列中存储时间偏移量(例如,上午12:25,只是时间,没有日期)。

我想在Visual Studio 2008中使用漂亮的数据可视化建模功能来生成dbml以及随之而来的代码。该数据库是Sql Server 2005。

由于TimeSpan本质上是一个包含刻度数的Int64(又名长),我试图在数据库中存储那么久。

但是,如果我指定列应映射到TimeSpan类型的属性,则Visual Studio将报告:

  

警告:自定义工具“MSLinqToSQLGenerator”失败。未指定的错误

要解决这个问题,我已将数据库值映射到内部属性,并且我添加了一个实现属性访问器的部分类,该类将数据库中的整数值转换为TimeSpan并返回。

有没有办法为这个属性生成正确的代码?或者是否有更好的方法在SqlServer 2005数据库中存储时间跨度,允许使用dbml更容易访问?

3 个答案:

答案 0 :(得分:4)

前段时间也遇到过这个问题。

据我所知,SQL Server 2005没有直接解决,所以我使用了一个技巧:

Duration类型的数据库中有TimeStamp列(实际上应该存储.NET BigInt NOT NULL数据类型)。这是dbml定义:

<Column Name="Duration" 
    Member="DurationInternal" 
    AccessModifier="Protected" 
    Type="System.Int64" 
    DbType="BigInt NOT NULL" 
    CanBeNull="false" />

我将此类属性设置为protected,这意味着我不希望我的类的用户直接访问此属性,并在部分类中为此属性创建一个public包装器:

    #region Properties
    /// <summary>
    /// Gets or sets the audio duration.
    /// </summary>
    /// <value>The duration.</value>
    public TimeSpan Duration
    {
        get
        {
            return TimeSpan.FromTicks(this.DurationInternal);
        }
        set
        {
            this.DurationInternal = value.Ticks;
        }
    }
    #endregion

因此,我的班级用户具有易于使用的属性,而不是很多longTimeSpan次转化。

希望,这有帮助。

答案 1 :(得分:3)

我曾尝试过这样做,史诗般的失败。我发现即使我没有在数据库中使用DateTime的Date部分,我发现将整个日期和时间提交到数据库允许我提供所需的所有功能。

您可以使用ToShortTimeString()仅显示应用程序中的时间。如果您需要这样做,那么在时间的完整日期允许您进行真正的时间计算,例如确定开始时间和停止时间之间的时间跨度。由于时间跨度所涉及的滴答包括日期,因此没有理由将额外的麻烦存储在数据库中。

我知道这不是你真正希望的,但可能是满足你需求的最简单的解决方案,而这来自于几个小时的尝试做同样事情的头脑经验。

答案 2 :(得分:1)

您可以将TimeSpan数据类型映射到Sql'Time'数据类型(从而避免任何讨厌的实现问题)。 但是,必须满足以下要求:

  1. 您的代码库必须正在运行 .Net 3.5 sp1
  2. Sql数据库必须 在Sql 2008上运行(时间 数据类型仅在2008年提供。
  3. 澄清说明: http://msdn.microsoft.com/en-us/library/bb882662.aspx