Access数据库无法在迁移中创建具有默认日期时间的表



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

我的连接字符串如下:

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驱动程序(它是一个遗留的Delphi应用程序(来实现这一点。

所以我有以下问题:

  • 我断言这在一般情况下是可能的,这是错误的吗
  • EF Core Jet提供商的行为是否错误
  • 最重要的是:我该如何做到这一点

编辑:为了阐明我的步骤,我总是在更改模型构建器配置后删除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提供程序的实现,这些时间值丢失了。因此,目前的情况如下:如果我使用

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

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

我相信它可能是:

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

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

但归根结底,如果OLEDB驱动程序支持它,我不知道。

我认为提供者可能错了。

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

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

它与您的不同,因为我使用的是DateTime.Now,但添加它可能会有所帮助??

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

相关内容

  • 没有找到相关文章

最新更新