1

我在迁移为我的表创建默认日期时间值时遇到了一些麻烦。我正在使用 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”。我尝试了以下事情:

  • entity.Property(e => e.EndTime).HasDefaultValueSql("#01.01.1900 15:30:00#");
  • entity.Property(e => e.EndTime).HasDefaultValueSql("#01.01.1900 15:30#");
  • entity.Property(e => e.EndTime).HasDefaultValueSql("#15:30:00#");
  • entity.Property(e => e.EndTime).HasDefaultValueSql("#15:30#");
  • entity.Property(e => e.EndTime).HasDefaultValueSql("#01/01/1900 03:30:00#");
  • entity.Property(e => e.EndTime).HasDefaultValueSql("#01/01/1900 03:30#");
  • entity.Property(e => e.EndTime).HasDefaultValueSql("#03:30:00#");
  • entity.Property(e => e.EndTime).HasDefaultValueSql("#03:30#");
  • entity.Property(e => e.EndTime).HasDefaultValue(new TimeSpan(15,30,0));
  • entity.Property(e => e.EndTime).HasDefaultValue(new TimeSpan(3,0,0));

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

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 应用程序)来执行此操作。

所以我有以下问题:

  • 我认为这通常是可能的,我错了吗?
  • EF-Core Jet 提供程序中实现的行为是否错误?
  • 最重要的是:我怎样才能让它工作?

编辑: 为了澄清我的步骤,我总是在更改模型构建器配置并使用功能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 的实施,这些时间值丢失了。所以目前的情况如下:如果我使用

  • DateTime我确实可以Update-Database成功调用,但没有时间值,只有日期
  • TimeSpanUpdate-Database通话失败(我怀疑 Access 不喜欢有时间的日期)
  • HasDefaultValueSql("#03:30:00#")调用时我也遇到异常UpdateDatabase

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

4

3 回答 3

0

一个,我相信它可能是:

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

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

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

于 2020-11-03T13:01:39.750 回答
0

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

我不确定如何将其应用于您的代码,但如果可能的话,需要考虑/尝试:当我添加我使用的日期时ToString()

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

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

于 2020-11-28T20:52:53.190 回答
0

问题确实是多种因素的组合,包括在 github 存储库中报告后修复的提供程序中的问题。

于 2021-01-14T10:09:06.553 回答