首页 > 解决方案 > Access 数据库无法在迁移中创建具有默认日期时间的表

问题描述

我在迁移为我的表创建默认日期时间值时遇到了一些麻烦。我正在使用 EF Core Jet 提供程序,需要使用 MS Access-MDB-Files。

我的连接字符串如下:

Provider=Microsoft.Jet.OLEDB.4.0;Jet OLEDB:Engine Type=4;User ID=Admin; Data Source=<my-mdb-file.mdb>

我想将属性的默认日期时间设置为时间“15:30”。我尝试了以下事情:

并且总是收到以下错误消息:

System.Data.OleDb.OleDbException (0x80040E14):CREATE TABLE 语句中的语法错误。

然后我深入研究了 EntityFrameworkCore.Jet 的源代码,并在 JetMigrationsSQLGenerator 类中的以下注释中找到: // Jet does not support defaults for hh:mm:ss in create table statement

但在我们的旧代码库中,我们正是使用 ADO-Driver(它是一个遗留的 Delphi 应用程序)来执行此操作。

所以我有以下问题:

编辑: 为了澄清我的步骤,我总是在更改模型构建器配置并使用功能Add-Migration <MigrationName>Update-Database对其进行测试后删除了 Migrations 文件夹。

编辑 2: 似乎 EF Core 提供者的评论并非完全错误。#12.30.1899 03:30:00#Access 不支持使用 TimeSpan 创建的组合日期时间。但是,如果直接在 Access 中输入 create 语句并使用 time ( #03:30:00#) 就可以了。但我无法让 EF Core 创建这样的语句。

编辑 3: 在我使用该函数的情况下,HasDefaultValueSql语法错误的原因似乎是 EF Jet Provider 中的一个错误。使用此函数时,创建的 SQL 语句以 this 结尾DEFAULT ('#<value>#'),的问题是不接受括号。这似乎是一个已知问题。

编辑 4: 我的应用程序文化存在问题。我更改了它,现在我可以让 EF Core 成功生成 DateTimes,但是由于 Jet-provider 的实施,这些时间值丢失了。所以目前的情况如下:如果我使用

我认为 EF Core Jet Provider 是这里的问题,但我并不完全相信。

标签: c#ms-accessentity-framework-corejet-ef-provider

解决方案


一个,我相信它可能是:

entity.Property(e => e.EndTime).HasDefaultValue(new DateTime(1899, 12, 30, 15, 30, 0));

因为它应该是DateTime值,而不是 TimeSpan。

但这一切都归结为,如果 OLEDB 驱动程序支持它,我不知道。


推荐阅读