Access 数据库无法在迁移中使用默认日期时间创建 table

Access database cannot create table with default datetime in migration

我在让迁移为我的表创建默认日期时间值时遇到了一些问题。我正在使用 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): Syntax error in CREATE TABLE statement.

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

但在我们的旧代码库中,我们使用 ADO 驱动程序(它是遗留的 Delphi 应用程序)来完成此操作。

所以我有以下问题:

编辑: 为了阐明我的步骤,我总是在更改模型构建器配置后删除 Migrations 文件夹,并使用函数 Add-Migration <MigrationName>Update-Database 来测试它。

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

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

编辑 4: 我的申请文化存在问题。我更改了它,现在我可以让 EF Core 成功生成 DateTimes,但是由于 Jet-provider 的实现,这些缺少时间值。 所以现在的情况是这样的: 如果我使用

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

我认为可能是:

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

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

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

我认为提供者可能是错误的。

我不确定如何将其应用到您的代码中,但如果可能的话 consider/try:当我添加日期时,我使用 ToString().

...
// ToString() removes the milliseconds which must be done to accomodate Access db.
cmd.Parameters.AddWithValue("MyField", DateTime.Now.ToString()); 
...

它与你的不一样,因为我正在使用 DateTime.Now 但也许添加它会有帮助??

问题确实是多种因素的结合,包括提供商中的问题,该问题在 github 存储库中的报告后得到修复。