ASP.NET Хранение TimeSpan в базе данных EF - PullRequest
0 голосов
/ 10 октября 2019

Я пытаюсь сохранить объекты временного интервала в базе данных 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)}
)

Но я получаю ошибку:

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.

Как я могу сохранить их в формате SQLдоволен?

1 Ответ

2 голосов
/ 10 октября 2019

Если вы используете .net core 2.1 или новее, вы можете использовать Преобразование значений в тики следующим образом:

builder.Entity<Test>()
    .Property(s => s.Time)
    .HasConversion(new TimeSpanToTicksConverter());

Если вы работаете с более старыми версиями, вы должны сделать это вручную, имея свойство типа 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; }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...