使用 dbml 将数据库值映射到 TimeSpan
-
21-08-2019 - |
题
我需要在数据库列中存储时间偏移量(例如,中午 12:25,只有时间,没有日期)。
我想使用 Visual Studio 2008 中出色的数据可视化建模功能来生成 dbml 及其相关代码。数据库是Sql Server 2005。
由于 TimeSpan 本质上是一个包含刻度数的 Int64(又名 long),因此我尝试将那么长的值存储在数据库中。
但是,如果我指定该列应映射到 TimeSpan 类型的属性,Visual Studio 会报告:
警告 :自定义工具“MSLinqToSQLGenerator”失败。未指定的错误
为了解决这个问题,我将数据库值映射到内部属性,并添加了一个部分类,该类实现属性访问器,将整数值从数据库转换为 TimeSpan 并返回。
有没有办法为该属性生成正确的代码?或者是否有更好的方法在 SqlServer 2005 数据库中存储时间跨度,以便使用 dbml 更轻松地访问?
解决方案
前段时间也遇到这个问题。
据我了解,没有直接解决方案 SQL Server 2005
, ,所以我使用了一个技巧:
有 Duration
列(实际上应该存储 .NET TimeStamp
数据类型)在数据库中的类型 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
转换。
希望这可以帮助。
其他提示
我以前曾尝试过这样做,但都失败了。我发现,即使我没有使用数据库中日期时间的日期部分,我发现将整个日期和时间提交到数据库允许我提供我需要的所有功能和时间。
您可以使用 ToShortTimeString() 仅显示应用程序中的时间。如果您需要的话,将完整的日期与时间结合起来可以让您进行真实的时间计算,例如确定开始时间和停止时间之间的时间跨度。由于与时间跨度相关的刻度包括日期,因此没有理由费尽心思将时间存储在数据库中。
我知道这并不是您真正所希望的,但可能是满足您需求的最简单的解决方案,这来自于我在尝试做同样的事情时花费了数小时的经验。
您可以将 TimeSpan 数据类型映射到 Sql“Time”数据类型(从而避免任何讨厌的实现问题)。但必须满足以下要求:
- 您的代码库必须在.NET 3.5 SP1上运行
- SQL数据库必须在SQL 2008上运行(时间数据类型仅在2008年可用)。
为了澄清,请阅读以下内容:http://msdn.microsoft.com/en-us/library/bb882662.aspx