我需要在数据库列中存储时间偏移量(例如,上午12:25,只是时间,没有日期)。
我想在Visual Studio 2008中使用漂亮的数据可视化建模功能来生成dbml以及随之而来的代码。该数据库是Sql Server 2005。
由于TimeSpan本质上是一个包含刻度数的Int64(又名长),我试图在数据库中存储那么久。
但是,如果我指定列应映射到TimeSpan类型的属性,则Visual Studio将报告:
警告:自定义工具“MSLinqToSQLGenerator”失败。未指定的错误
要解决这个问题,我已将数据库值映射到内部属性,并且我添加了一个实现属性访问器的部分类,该类将数据库中的整数值转换为TimeSpan并返回。
有没有办法为这个属性生成正确的代码?或者是否有更好的方法在SqlServer 2005数据库中存储时间跨度,允许使用dbml更容易访问?
答案 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
因此,我的班级用户具有易于使用的属性,而不是很多long
到TimeSpan
次转化。
希望,这有帮助。
答案 1 :(得分:3)
我曾尝试过这样做,史诗般的失败。我发现即使我没有在数据库中使用DateTime的Date部分,我发现将整个日期和时间提交到数据库允许我提供所需的所有功能。
您可以使用ToShortTimeString()仅显示应用程序中的时间。如果您需要这样做,那么在时间的完整日期允许您进行真正的时间计算,例如确定开始时间和停止时间之间的时间跨度。由于时间跨度所涉及的滴答包括日期,因此没有理由将额外的麻烦存储在数据库中。
我知道这不是你真正希望的,但可能是满足你需求的最简单的解决方案,而这来自于几个小时的尝试做同样事情的头脑经验。
答案 2 :(得分:1)
您可以将TimeSpan数据类型映射到Sql'Time'数据类型(从而避免任何讨厌的实现问题)。 但是,必须满足以下要求: