Миграция с EF Core 2 на EF Core 3 - точность даты и времени в миллисекундах - PullRequest
0 голосов
/ 07 января 2020

У меня есть некоторые миграции, которые вставляют некоторые данные в базу данных, и это одна из них:

 migrationBuilder.InsertData(
            table: "TSegment",
            columns: new[] { "SegmentId", "CreatedOn", "ParentId", "SegmentType", "UpdatedOn" },
            values: new object[,]
            {
                { 1, new DateTime(2019, 1, 22, 12, 24, 23, 48, DateTimeKind.Utc).AddTicks(4948), null, "YouAndYourFamily", new DateTime(2019, 1, 22, 12, 24, 23, 48, DateTimeKind.Utc).AddTicks(5782) },
                { 2, new DateTime(2019, 1, 22, 12, 24, 23, 48, DateTimeKind.Utc).AddTicks(6649), 1, "AboutYou", new DateTime(2019, 1, 22, 12, 24, 23, 48, DateTimeKind.Utc).AddTicks(6658) },
                { 3, new DateTime(2019, 1, 22, 12, 24, 23, 48, DateTimeKind.Utc).AddTicks(6670), 1, "YourFamily", new DateTime(2019, 1, 22, 12, 24, 23, 48, DateTimeKind.Utc).AddTicks(6676) },
                { 4, new DateTime(2019, 1, 22, 12, 24, 23, 48, DateTimeKind.Utc).AddTicks(6679), 1, "Employment", new DateTime(2019, 1, 22, 12, 24, 23, 48, DateTimeKind.Utc).AddTicks(6685) },
                { 5, new DateTime(2019, 1, 22, 12, 24, 23, 48, DateTimeKind.Utc).AddTicks(6688), null, "HomeAndContact", new DateTime(2019, 1, 22, 12, 24, 23, 48, DateTimeKind.Utc).AddTicks(6694) },
                { 6, new DateTime(2019, 1, 22, 12, 24, 23, 48, DateTimeKind.Utc).AddTicks(6700), 5, "YourHome", new DateTime(2019, 1, 22, 12, 24, 23, 48, DateTimeKind.Utc).AddTicks(6703) },
                { 7, new DateTime(2019, 1, 22, 12, 24, 23, 48, DateTimeKind.Utc).AddTicks(6709), 5, "ContactDetails", new DateTime(2019, 1, 22, 12, 24, 23, 48, DateTimeKind.Utc).AddTicks(6712) }
            });

После обновления EF Core до версии 3 приведенный выше код генерирует эту вставку:

IF EXISTS (SELECT * FROM [sys].[identity_columns] WHERE [name] IN (N'SegmentId', N'CreatedOn', N'ParentId', N'SegmentType', N'UpdatedOn') AND [object_id] = OBJECT_ID(N'[TSegment]'))
SET IDENTITY_INSERT [TSegment] ON;
INSERT INTO [TSegment] ([SegmentId], [CreatedOn], [ParentId], [SegmentType], [UpdatedOn])
VALUES (1, '2019-01-22T12:24:23.0484948Z', NULL, N'YouAndYourFamily', '2019-01-22T12:24:23.0485782Z'),
(2, '2019-01-22T12:24:23.0486649Z', 1, N'AboutYou', '2019-01-22T12:24:23.0486658Z'),
(3, '2019-01-22T12:24:23.0486670Z', 1, N'YourFamily', '2019-01-22T12:24:23.0486676Z'),
(4, '2019-01-22T12:24:23.0486679Z', 1, N'Employment', '2019-01-22T12:24:23.0486685Z'),
(5, '2019-01-22T12:24:23.0486688Z', NULL, N'HomeAndContact', '2019-01-22T12:24:23.0486694Z'),
(6, '2019-01-22T12:24:23.0486700Z', 5, N'YourHome', '2019-01-22T12:24:23.0486703Z'),
(7, '2019-01-22T12:24:23.0486709Z', 5, N'ContactDetails', '2019-01-22T12:24:23.0486712Z');
IF EXISTS (SELECT * FROM [sys].[identity_columns] WHERE [name] IN (N'SegmentId', N'CreatedOn', N'ParentId', N'SegmentType', N'UpdatedOn') AND [object_id] = OBJECT_ID(N'[TSegment]'))
    SET IDENTITY_INSERT [TSegment] OFF;

Как мы видим, даты в миллисекундах имеют 6 десятичных знаков, но если я понижу EF Core до версии 2, такая же миграция генерирует эту вставку:

IF EXISTS (SELECT * FROM [sys].[identity_columns] WHERE [name] IN (N'SegmentId', N'CreatedOn', N'ParentId', N'SegmentType', N'UpdatedOn') AND [object_id] = OBJECT_ID(N'[TSegment]'))
SET IDENTITY_INSERT [TSegment] ON;
INSERT INTO [TSegment] ([SegmentId], [CreatedOn], [ParentId], [SegmentType], [UpdatedOn])
VALUES (1, '2019-01-22T12:24:23.048', NULL, N'YouAndYourFamily', '2019-01-22T12:24:23.048'),
(2, '2019-01-22T12:24:23.048', 1, N'AboutYou', '2019-01-22T12:24:23.048'),
(3, '2019-01-22T12:24:23.048', 1, N'YourFamily', '2019-01-22T12:24:23.048'),
(4, '2019-01-22T12:24:23.048', 1, N'Employment', '2019-01-22T12:24:23.048'),
(5, '2019-01-22T12:24:23.048', NULL, N'HomeAndContact', '2019-01-22T12:24:23.048'),
(6, '2019-01-22T12:24:23.048', 5, N'YourHome', '2019-01-22T12:24:23.048'),
(7, '2019-01-22T12:24:23.048', 5, N'ContactDetails', '2019-01-22T12:24:23.048');
IF EXISTS (SELECT * FROM [sys].[identity_columns] WHERE [name] IN (N'SegmentId', N'CreatedOn', N'ParentId', N'SegmentType', N'UpdatedOn') AND [object_id] = OBJECT_ID(N'[TSegment]'))
    SET IDENTITY_INSERT [TSegment] OFF;

Как SQL Сервер имеет точность из 3 десятичных знаков, и я не могу изменить все столбцы даты и времени на Datetime2, кто-нибудь знает обходной путь для этого?

Ответы [ 2 ]

0 голосов
/ 07 января 2020

Ну, проблема не в миллисекундах. Я удалил AddTicks, а также миллисекунды из моей миграции:

  migrationBuilder.InsertData(
            table: "TSegment",
            columns: new[] { "SegmentId", "CreatedOn", "ParentId", "SegmentType", "UpdatedOn" },
            values: new object[,]
            {
                { 1, new DateTime(2019, 1, 22, 12, 24, 23, DateTimeKind.Utc), null, "YouAndYourFamily", new DateTime(2019, 1, 22, 12, 24, 23,DateTimeKind.Utc) },
                { 2, new DateTime(2019, 1, 22, 12, 24, 23, DateTimeKind.Utc), 1, "AboutYou", new DateTime(2019, 1, 22, 12, 24, 23,DateTimeKind.Utc)},
                { 3, new DateTime(2019, 1, 22, 12, 24, 23, DateTimeKind.Utc), 1, "YourFamily", new DateTime(2019, 1, 22, 12, 24, 23,DateTimeKind.Utc) },
                { 4, new DateTime(2019, 1, 22, 12, 24, 23, DateTimeKind.Utc), 1, "Employment", new DateTime(2019, 1, 22, 12, 24, 23,DateTimeKind.Utc) },
                { 5, new DateTime(2019, 1, 22, 12, 24, 23, DateTimeKind.Utc), null, "HomeAndContact", new DateTime(2019, 1, 22, 12, 24, 23,DateTimeKind.Utc) },
                { 6, new DateTime(2019, 1, 22, 12, 24, 23, DateTimeKind.Utc), 5, "YourHome", new DateTime(2019, 1, 22, 12, 24, 23,DateTimeKind.Utc) },
                { 7, new DateTime(2019, 1, 22, 12, 24, 23, DateTimeKind.Utc), 5, "ContactDetails", new DateTime(2019, 1, 22, 12, 24, 23,DateTimeKind.Utc) }
            });

, которая теперь генерирует следующий скрипт:

IF EXISTS (SELECT * FROM [sys].[identity_columns] WHERE [name] IN (N'SegmentId', N'CreatedOn', N'ParentId', N'SegmentType', N'UpdatedOn') AND [object_id] = OBJECT_ID(N'[TSegment]'))
SET IDENTITY_INSERT [TSegment] ON;

INSERT INTO [TSegment] ([SegmentId], [CreatedOn] , [ParentId], [SegmentType], [updatedOn]) ЗНАЧЕНИЯ (1, '2019-01-22T12: 24: 23.0000000Z', NULL, N'YouAndYourFamily ',' 2019-01-22T12: 24: 23.0000000Z ') , (2, '2019-01-22T12: 24: 23.0000000Z', 1, N'AboutYou ',' 2019-01-22T12: 24: 23.0000000Z '), (3,' 2019-01-22T12: 24: 23.0000000Z ', 1, N'YourFamily', '2019-01-22T12: 24: 23.0000000Z'), (4, '2019-01-22T12: 24: 23.0000000Z', 1, N'Employment ',' 2019 -01-22T12: 24: 23.0000000Z '), (5,' 2019-01-22T12: 24: 23.0000000Z ', NULL, N'HomeAndContact', '2019-01-22T12: 24: 23.0000000Z'), ( 6, '2019-01-22T12: 24: 23.0000000Z', 5, N'YourHome ',' 2019-01-22T12: 24: 23.0000000Z '), (7,' 2019-01-22T12: 24: 23.0000000Z ', 5, N'ContactDetails', '2019-01-22T12: 24: 23.0000000Z'); ЕСЛИ СУЩЕСТВУЕТ (ВЫБРАТЬ * ИЗ [sys]. [Identity_columns] ГДЕ [имя] IN (N'SegmentId ', N'CreatedOn', N'ParentId ', N'SegmentType', N'UpdatedOn ') И [object_id] = OBJECT_ID (N '[TSegment]')) SET IDENTITY_INSERT [TSegment] OFF;

Он по-прежнему генерирует 6 десятичных разрядов в течение миллисекунд, и это исключение выдается:

Microsoft.Data.SqlClient.SqlException (0x80131904): Conversion failed when converting date and/or time from character string.

в Microsoft.Data .SqlClient.SqlConnection.OnError (SqlException исключение, Boolean breakConnection, действие 1 wrapCloseInAction) at Microsoft.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action 1 wrapCloseInAction) в Microsoft.Data.SqlClient.TdsParser.ThrowExceptionAndWarning (TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) в Microsoft.Data.SqlClient.TdsParser.TryRun (RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean & dataReady) в Майкрософт.Data.SqlClient SqlClient.SqlComm and.InternalExecuteNonQuery (TaskCompletionSource 1 completion, Boolean sendToPipe, Int32 timeout, Boolean& usedCache, Boolean asyncWrite, Boolean inRetry, String methodName) at Microsoft.Data.SqlClient.SqlCommand.ExecuteNonQuery() at Microsoft.EntityFrameworkCore.Storage.RelationalCommand.ExecuteNonQuery(RelationalCommandParameterObject parameterObject) at Microsoft.EntityFrameworkCore.Migrations.MigrationCommand.ExecuteNonQuery(IRelationalConnection connection, IReadOnlyDictionary 2 parameterValues) в Microsoft.EntityFrameworkCore.Migrations.Internal.MigrationCommandExecutor.ExecuteNonQuery (соединение IEnumerable`1igrationCommands, IRelationalConnection.MigrationMigMigrationMigration.MigrationMigrationMraigMerationMragMerationMrame) .EntityFrameworkCore.RelationalDatabaseFacadeExtensions. что-то упустил?

0 голосов
/ 07 января 2020

Вы можете решить свою проблему, обернув ее в sqlDataTime структуру, например:

new SqlDateTime (DateTime value) 

, если это объект poco:
Вы можете попробовать указать столбец введите с данными аннотации, как это

[Column(TypeName = "datetime")]
DateTime CreatedOn {get;set;}

см. документы

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...