Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
2.1k views
in Technique[技术] by (71.8m points)

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”。我尝试了以下操作:

  • 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测试此。

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

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

编辑4: 关于我的应用程序文化存在一个问题。我对其进行了更改,现在我可以使EF Core成功地生成DateTime,但是由于Jet提供程序的实现,这些值缺少时间值。所以目前的情况如下:如果我使用

  • DateTime我确实可以Update-Database成功拨打电话,但没有时间值,只有日期
  • TimeSpan在Update-Database调用失败(我怀疑访问不喜欢和时间日期)
  • HasDefaultValueSql("#03:30:00#") 我在打电话时也遇到异常 UpdateDatabase

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


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

Please log in or register to answer this question.

Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...