SQLServerの日時タイプのデフォルト値が間違っています

マルセル

CategorynmのBlog関係を仮定しましょう

CREATE TABLE Categories(
    Id INT IDENTITY(1,1) NOT NULL,
    Title NVARCHAR(MAX) NOT NULL,
    Created datetime NOT NULL,
    CONSTRAINT PK_Categories PRIMARY KEY(Id)
)
CREATE TABLE Posts(
    Id INT IDENTITY(1,1) NOT NULL,
    Subject NVARCHAR(MAX) NOT NULL,
    Body NVARCHAR(MAX) NULL,
    CONSTRAINT PK_Posts PRIMARY KEY (Id)
)
CREATE TABLE PostCategory(
    CategoryId INT NOT NULL,
    PostId INT NOT NULL,
    CONSTRAINT PK_PostCategory PRIMARY KEY (CategoryId, PostId),
    FOREIGN KEY ([CategoryId]) REFERENCES [Categories]([Id]),
    FOREIGN KEY ([PostId]) REFERENCES [Posts]([Id])
)

データベースをスキャフォールディングした後(https://docs.microsoft.com/en-us/ef/core/get-started/aspnetcore/existing-db#reverse-engineer-your-modelを参照)、最初のクエリを開始しました。

var postsWithLatestCategoryTimestamp = (
        from post in db.Posts
        let latestCategoryTimestamp =
            (
                from relation in post.PostCategory
                orderby relation.Category.Created descending
                select relation.Category.Created
            )
            .FirstOrDefault()
        select new
        {
            post.Id, post.Subject, latestCategoryTimestamp
        }
    ).ToList();

私は得た

System.Data.SqlClient.SqlException: '文字列から日付や時刻を変換するときに変換に失敗しました。'

理由:EntityFramework Coreが('0001-01-01T00:00:00.0000000'.ではなく'1753-01-01T00:00:00.000'間違ったデフォルト値を使用している

SELECT [post].[Id], [post].[Subject], COALESCE((
    SELECT TOP(1) [relation.Category].[Created]
    FROM [PostCategory] AS [relation]
    INNER JOIN [Categories] AS [relation.Category] ON [relation].[CategoryId] = [relation.Category].[Id]
    WHERE [post].[Id] = [relation].[PostId]
    ORDER BY [relation.Category].[Created] DESC
), '0001-01-01T00:00:00.0000000') AS [latestCategoryTimestamp]
FROM [Posts] AS [post]

既存のデータベースに触れずに修正するにはどうすればよいですか?


ちなみに、OnModelCreating()足場はしっかりしています:

modelBuilder.Entity<Categories>(entity =>
{
    entity.Property(e => e.Created).HasColumnType("datetime");
    //...
});
Ivan Stoev

EF Coreのバグのように見えるかもしれませんが、私にはそれは間違ったクエリのようです。

EF Coreが、CLRのDateTimeデフォルトをSqlServerの最小サポート日に「正しく」変換することを想像してみてくださいマテリアライズされた結果が得られたら、それlatestCategoryTimestampがデフォルトかどうかをどのようにして知ることができますか?SqlServerの最小日付と照合していますか?インメモリデータベースまたはその他のデータベースに対してクエリを実行している場合はどうなりますか?彼らはそれをメモリに戻す必要があると言うかもしれませんか?データベースの最小値をマップする必要があるのはなぜdefault(DateTime)ですか?ではどうDateTime.MinValueですか?

結論は、の正しいマッピングがないということですdefault(DateTime)問題は、なぜ「魔法の」値を使用して欠落値を表すのかということです。データベースはそれを提供NULLし、C#(CLR)-null許容型です。

したがって、最も論理的な方法はnull許容型を使用することです。クエリで変更する必要があるのは、DateTime?ここにキャストを追加することだけです

select (DateTime?)relation.Category.Created

ただし、ここで必要なのは最大日付だけなので、Maxメソッドを使用するだけで十分です(ただし、null許容のオーバーロードを使用します)。

let latestCategoryTimestamp = post.PostCategory.Max(link => (DateTime?)link.Category.Created)

ただし、どのアプローチを選択した場合でも、必要なのNullable<DateTime>は、マテリアライズされたオブジェクトのプロパティを考慮することだけです良い点はnull、データベースの種類に関係なく、が欠落している投稿カテゴリを示すことです。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Rails移行エラーのデフォルト値が間違っています

分類Dev

php my adminのデフォルトのタイムスタンプは、正しいタイムゾーンを使用しても間違っています

分類Dev

デフォルトの日付と時刻に間違ったタイムゾーンを保存する

分類Dev

SQLServerの日時フィールドのデフォルト値をタイムスタンプに追加します

分類Dev

SQLServerの列の日付形式が間違っています

分類Dev

Laravelのフォームの値が間違っています

分類Dev

コメントで始まるファイルのmimeタイプが間違っています

分類Dev

SQLServerデータベースファイルへの接続に問題があります。私は何が間違っているのですか?

分類Dev

CSS要素のタイトルが間違っています

分類Dev

pytzタイムゾーンの夏時間のオフセットが間違っています

分類Dev

DYMOのデフォルトは間違ったラベルタイプです

分類Dev

ツールバーのタイトルとサブタイトルのフォントサイズが間違っています

分類Dev

SQLServerの日時のデフォルト値を削除する方法

分類Dev

max.request.sizeとmessage.max.bytesのデフォルト値が間違っているようです

分類Dev

AngularDateパイプの月の値が間違っています

分類Dev

マルチパートフォームを使用したAngularPost-Requestのコンテンツタイプが間違っています

分類Dev

デフォルトのシェルが間違っているときにsshでログインする方法

分類Dev

ハイチャートツールチップの日付が間違っています

分類Dev

シェイプへのフォーカスのリクエストが間違ったコントロールになっています

分類Dev

sheet.nrowsの値が間違っています-pythonExcelファイル

分類Dev

タイムデルタ操作の結果が間違っています

分類Dev

タイムスタンプから日付を取得する:PHPの日付が間違っています

分類Dev

フルカレンダー:イベントの終了時刻が間違っています

分類Dev

Gradleが間違ったプロジェクトのlibフォルダーでaarを探しています

分類Dev

xmlファイルのコメントの配置が間違っています

分類Dev

TwinCAT3-MatlabでADSデータストリームから読み取るときのタイムスタンプの値が間違っています

分類Dev

瞬間JSプラグインの日付が間違っています

分類Dev

第1引数のタイプが間違っています

分類Dev

htaccessファイルの設定が間違っています

Related 関連記事

  1. 1

    Rails移行エラーのデフォルト値が間違っています

  2. 2

    php my adminのデフォルトのタイムスタンプは、正しいタイムゾーンを使用しても間違っています

  3. 3

    デフォルトの日付と時刻に間違ったタイムゾーンを保存する

  4. 4

    SQLServerの日時フィールドのデフォルト値をタイムスタンプに追加します

  5. 5

    SQLServerの列の日付形式が間違っています

  6. 6

    Laravelのフォームの値が間違っています

  7. 7

    コメントで始まるファイルのmimeタイプが間違っています

  8. 8

    SQLServerデータベースファイルへの接続に問題があります。私は何が間違っているのですか?

  9. 9

    CSS要素のタイトルが間違っています

  10. 10

    pytzタイムゾーンの夏時間のオフセットが間違っています

  11. 11

    DYMOのデフォルトは間違ったラベルタイプです

  12. 12

    ツールバーのタイトルとサブタイトルのフォントサイズが間違っています

  13. 13

    SQLServerの日時のデフォルト値を削除する方法

  14. 14

    max.request.sizeとmessage.max.bytesのデフォルト値が間違っているようです

  15. 15

    AngularDateパイプの月の値が間違っています

  16. 16

    マルチパートフォームを使用したAngularPost-Requestのコンテンツタイプが間違っています

  17. 17

    デフォルトのシェルが間違っているときにsshでログインする方法

  18. 18

    ハイチャートツールチップの日付が間違っています

  19. 19

    シェイプへのフォーカスのリクエストが間違ったコントロールになっています

  20. 20

    sheet.nrowsの値が間違っています-pythonExcelファイル

  21. 21

    タイムデルタ操作の結果が間違っています

  22. 22

    タイムスタンプから日付を取得する:PHPの日付が間違っています

  23. 23

    フルカレンダー:イベントの終了時刻が間違っています

  24. 24

    Gradleが間違ったプロジェクトのlibフォルダーでaarを探しています

  25. 25

    xmlファイルのコメントの配置が間違っています

  26. 26

    TwinCAT3-MatlabでADSデータストリームから読み取るときのタイムスタンプの値が間違っています

  27. 27

    瞬間JSプラグインの日付が間違っています

  28. 28

    第1引数のタイプが間違っています

  29. 29

    htaccessファイルの設定が間違っています

ホットタグ

アーカイブ