微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决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));

并始终收到以下错误消息:

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提供程序中实现的行为是否错误
  • 最重要的是:如何使它正常工作?

编辑: 为了阐明我的步骤,我总是在更改模型构建器配置后删除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成功地生成DateTime,但是由于Jet提供程序的实现,这些值缺少时间值。 所以目前的情况如下: 如果我使用

  • DateTime我确实可以成功调用Update-Database,但没有时间值,只有日期
  • TimeSpan的{​​{1}}调用失败(我怀疑Access不喜欢带日期的日期)
  • Update-Database调用HasDefaultValuesql("#03:30:00#")
  • 时也会出现异常

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

解决方法

我相信可能是:

entity.Property(e => e.EndTime).HasDefaultValue(new DateTime(1899,12,30,15,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 存储库中的报告后得到修复。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。