Предположим, что отношение Category
n-m 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 использует неправильное значение по умолчанию ('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");
//...
});