ASP.NET 在 EF 数据库中存储 TimeSpan

Haw*_*wke 0 asp.net entity-framework

我正在尝试将时间跨度对象存储在 EF Sql 数据库中,如下所示:

public class Test
{
  [Required, Key]
  public int TestId { get; set; }
  public TimeSpan Time { get; set; }
}

modelBuilder.Entity<Test>().HasData(
                new Test {TestId = 1, Time = TimeSpan.FromDays(5)}
)
Run Code Online (Sandbox Code Playgroud)

但我收到错误:

System.Data.SqlClient.SqlException (0x80131904): Conversion failed when converting date and/or time from character string.
   at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
   at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
   at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
   at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserState
Object stateObj, Boolean& dataReady)
   at System.Data.SqlClient.SqlCommand.RunExecuteNonQueryTds(String methodName, Boolean async, Int32 timeout, Boolean asyncWrite)
   at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource`1 completion, Boolean sendToPipe, Int32 timeout, Boolean asyncWrite, String methodName)
   at System.Data.SqlClient.SqlCommand.ExecuteNonQuery()
   at Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommand.Execute(IRelationalConnection connection, DbCommandMethod executeMethod, IReadOnlyDictionary`2 paramete
rValues)
   at Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommand.ExecuteNonQuery(IRelationalConnection connection, IReadOnlyDictionary`2 parameterValues)
   at Microsoft.EntityFrameworkCore.Migrations.MigrationCommand.ExecuteNonQuery(IRelationalConnection connection, IReadOnlyDictionary`2 parameterValues)
   at Microsoft.EntityFrameworkCore.Migrations.Internal.MigrationCommandExecutor.ExecuteNonQuery(IEnumerable`1 migrationCommands, IRelationalConnection connection)
   at Microsoft.EntityFrameworkCore.Migrations.Internal.Migrator.Migrate(String targetMigration)
   at Microsoft.EntityFrameworkCore.Design.Internal.MigrationsOperations.UpdateDatabase(String targetMigration, String contextType)
   at Microsoft.EntityFrameworkCore.Design.OperationExecutor.UpdateDatabase.<>c__DisplayClass0_1.<.ctor>b__0()
   at Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.Execute(Action action)
ClientConnectionId:b2ff74ea-6a41-49c5-9e24-fefe36619f40
Error Number:241,State:1,Class:16
Conversion failed when converting date and/or time from character string.
Run Code Online (Sandbox Code Playgroud)

如何以 SQL 满意的格式存储它们?

Tia*_*lva 5

如果您使用 .net core 2.1 或更高版本,您可以使用 Value Conversion to Ticks,如下所示:

builder.Entity<Test>()
    .Property(s => s.Time)
    .HasConversion(new TimeSpanToTicksConverter());
Run Code Online (Sandbox Code Playgroud)

如果您运行旧版本,则必须通过将刻度记录到数据库中的 Long 类型的属性以及与您的跨度匹配的未映射属性来手动执行此操作,如下所示:

public class Test
{
  [Required, Key]
  public int TestId { get; set; }
  public long TimeTicks { get { return Time.Ticks; } set { Time = TimeSpan.FromTicks( value );}}
  [NotMapped]
  public TimeSpan Time { get; set; }
}
Run Code Online (Sandbox Code Playgroud)