Access 数据库无法在迁移中使用默认日期时间创建 table
Access database cannot create table with default datetime in migration
我在让迁移为我的表创建默认日期时间值时遇到了一些问题。我正在使用 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): Syntax error in CREATE TABLE statement.
然后我深入研究了 EntityFrameworkCore.Jet 的源代码,并在 class 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-provider 的实现,这些缺少时间值。
所以现在的情况是这样的:
如果我使用
DateTime
我确实可以调用 Update-Database
成功,但是没有时间值,只有日期
TimeSpan
Update-Database
调用失败(我怀疑 Access 不喜欢带时间的日期)
HasDefaultValueSql("#03:30:00#")
我在调用 UpdateDatabase
时也出现异常
我认为 EF Core Jet Provider 是这里的问题,但我并不完全相信。
我认为可能是:
entity.Property(e => e.EndTime).HasDefaultValue(new DateTime(1899, 12, 30, 15, 30, 0));
因为它应该是 DateTime 值,而不是 TimeSpan。
但这一切都归结为,如果 OLEDB 驱动程序支持它,我不知道。
我认为提供者可能是错误的。
我不确定如何将其应用到您的代码中,但如果可能的话 consider/try:当我添加日期时,我使用 ToString()
.
...
// ToString() removes the milliseconds which must be done to accomodate Access db.
cmd.Parameters.AddWithValue("MyField", DateTime.Now.ToString());
...
它与你的不一样,因为我正在使用 DateTime.Now
但也许添加它会有帮助??
问题确实是多种因素的结合,包括提供商中的问题,该问题在 github 存储库中的报告后得到修复。
我在让迁移为我的表创建默认日期时间值时遇到了一些问题。我正在使用 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): Syntax error in CREATE TABLE statement.
然后我深入研究了 EntityFrameworkCore.Jet 的源代码,并在 class 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-provider 的实现,这些缺少时间值。 所以现在的情况是这样的: 如果我使用
DateTime
我确实可以调用Update-Database
成功,但是没有时间值,只有日期TimeSpan
Update-Database
调用失败(我怀疑 Access 不喜欢带时间的日期)HasDefaultValueSql("#03:30:00#")
我在调用UpdateDatabase
时也出现异常
我认为 EF Core Jet Provider 是这里的问题,但我并不完全相信。
我认为可能是:
entity.Property(e => e.EndTime).HasDefaultValue(new DateTime(1899, 12, 30, 15, 30, 0));
因为它应该是 DateTime 值,而不是 TimeSpan。
但这一切都归结为,如果 OLEDB 驱动程序支持它,我不知道。
我认为提供者可能是错误的。
我不确定如何将其应用到您的代码中,但如果可能的话 consider/try:当我添加日期时,我使用 ToString()
.
...
// ToString() removes the milliseconds which must be done to accomodate Access db.
cmd.Parameters.AddWithValue("MyField", DateTime.Now.ToString());
...
它与你的不一样,因为我正在使用 DateTime.Now
但也许添加它会有帮助??
问题确实是多种因素的结合,包括提供商中的问题,该问题在 github 存储库中的报告后得到修复。