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

C# Access数据库无法在迁移中创建具有默认日期时间的表,c#,ms-access,entity-framework-core,jet-ef-provider,C#,Ms Access,Entity Framework Core,Jet Ef Provider,我很难让迁移为我的表创建默认的日期时间值。我正在使用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> Provider=Microsoft.Jet.OLEDB.4.0;喷射OLEDB:发动机类型=4;用户ID=管理员;数据源= 我想

我很难让迁移为我的表创建默认的日期时间值。我正在使用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>
Provider=Microsoft.Jet.OLEDB.4.0;喷射OLEDB:发动机类型=4;用户ID=管理员;数据源=
我想将属性的默认日期时间设置为“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(新的时间跨度(15,30,0))
  • entity.Property(e=>e.EndTime).HasDefaultValue(新的时间跨度(3,0,0))
并始终收到以下错误消息:

System.Data.OleDb.OLEDBEException(0x80040E14):CREATE TABLE语句中出现语法错误

然后,我深入研究了EntityFrameworkCore.Jet的源代码,并在类JetMigrationsSQLGenerator中的以下注释中找到了它:
//Jet不支持create table语句中hh:mm:ss的默认值

但在我们的旧代码库中,我们使用ADO驱动程序(它是一个遗留的Delphi应用程序)来实现这一点

因此,我有以下问题:

  • 我断言这在总体上是可能的,这是错的吗
  • EF Core Jet提供商中实施的行为是否错误
  • 最重要的是:我怎样才能让它工作
编辑: 为了澄清我的步骤,我总是在更改model builder配置后删除Migrations文件夹,并使用函数
添加迁移
更新数据库
来测试这一点

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

编辑3: 在我使用函数
hasdaultvaluesql
的情况下,错误语法的原因似乎是EF-Jet提供程序中的一个bug。使用此函数时,创建的SQL语句以
DEFAULT(“###”)结尾,
问题是不接受括号。这似乎是一个众所周知的问题

编辑4: 有一个关于我的应用程序文化的问题。我更改了它,现在我可以让EF Core成功地生成日期时间,但是由于Jet提供程序的实现,这些时间值丢失了。 因此,目前的情况如下: 如果我使用

  • DateTime
    我确实可以成功调用
    更新数据库
    ,但没有时间值,只有日期
  • TimeSpan
    updatedatabase
    调用失败(我怀疑Access不喜欢日期和时间)
  • hasdaultvaluesql(“#03:30:00#”)
    调用
    UpdateDatabase时,我也会遇到一个异常

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

我认为可能的问题是:

entity.Property(e => e.EndTime).HasDefaultValue(new DateTime(1899, 12, 30, 15, 30, 0));
因为它应该是日期时间值,而不是时间跨度


但归根结底,如果OLEDB驱动程序支持它,我不知道。我相信它可能是:

entity.Property(e => e.EndTime).HasDefaultValue(new DateTime(1899, 12, 30, 15, 30, 0));
因为它应该是日期时间值,而不是时间跨度


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

我认为提供商可能是错的

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


它与您的不一样,因为我使用的是
DateTime。现在
,但添加它可能会有所帮助???

我认为提供程序可能是错误的

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


它与您的不一样,因为我使用的是
DateTime。现在
,但添加它可能会有所帮助???

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

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

在这一点上您肯定没有错,这是可能的。我没有准备好EF核心项目,但请尝试指定一个数值。Access将日期表示为整天+小时、分钟和秒的分数,因此15:30对应于15.5/24=0.6458333
#12.30.1899 03:30:00
对于Access来说是无效的语法。请尝试:
#12/30/1899 03:30:00#
@Gustav感谢您指出,我的应用程序的CultureInfo似乎是错误的(但我认为EF Core Jet不应该在我的CultureInfo上运行…)。但似乎03:30:00的时间也无法解析,并引发语法错误异常。如果我用MsAccess测试,我会得到相同的错误消息。但在那里使用#03:30:00#至少有效。@Tobias请在我们的网站上打开一个问题