c# - 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
对其进行测试后删除了 Migrations 文件夹。
编辑 2:
似乎 EF Core 提供者的评论并非完全错误。#12.30.1899 03:30:00#
Access 不支持使用 TimeSpan 创建的组合日期时间。但是,如果直接在 Access 中输入 create 语句并使用 time ( #03:30:00#
) 就可以了。但我无法让 EF Core 创建这样的语句。
编辑 3:
在我使用该函数的情况下,HasDefaultValueSql
语法错误的原因似乎是 EF Jet Provider 中的一个错误。使用此函数时,创建的 SQL 语句以 this 结尾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 驱动程序支持它,我不知道。
推荐阅读
- r - 如何使用 R 使用 Google Translate API 进行 POST 调用
- rust - 我可以制作 size_of::
- c# - 通过单击 c# 中的按钮在 wpf 应用程序中添加树视图
- html - 当 z-index 不起作用时,如何使一个元素显示在另一个元素上?
- applescript - How do I set the new resolution of an image
- php - PHP OOP 方法
- jquery - 从 HTML 输入的值中获取对象
- php - JQuery ajax返回没有类的新html
- python - Django celery 找不到 celery 模块
- javascript - AWS 无服务器端点问题