DBFirst - 使用MySQL Connector和EF6,如何将时间戳列识别为StoreGeneratedPattern = Computed?

时间:2016-05-23 08:22:52

标签: mysql .net entity-framework timestamp

我有一张这样的表:

CREATE TABLE `incidentdata` (
  `IncidentDataID` int(11) NOT NULL AUTO_INCREMENT,
  `GUID` binary(16) NOT NULL,
  `LastModified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `Incident_ID` int(11) NOT NULL,
  `Parameter_ID` int(11) NOT NULL,
  `Value` varchar(255) NOT NULL DEFAULT '',
  PRIMARY KEY (`IncidentDataID`),
  UNIQUE KEY `GUID_UNIQUE` (`GUID`),
  KEY `FK_INCDATA_INC` (`Incident_ID`),
  KEY `FK_INCDATA_PAR` (`Parameter_ID`),
  CONSTRAINT `FK_INCDATA_INC` FOREIGN KEY (`Incident_ID`) REFERENCES `incidents` (`IncidentID`) ON DELETE NO ACTION ON UPDATE NO ACTION,
  CONSTRAINT `FK_INCDATA_PAR` FOREIGN KEY (`Parameter_ID`) REFERENCES `eventparameters` (`ParameterID`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf8$$

使用EF 6和MySQL Connector 6.9.8以及MySQL 5.5.21时,首先通过DB更新模型始终将LastModified列设置为StoreGeneratedPattern = None

当我在此表中插入记录时,LastModified列始终为0 - 因为.NET中的默认值System.DateTime = 0.当我更新记录时,{{1}然后根据需要将值更新为LastModified

我找到了两个可以用作解决方法的选项:

  1. 手动更改StoreGeneratedPattern =' Computed'。当我们改变模式时(现在每天都是这样!),这总是被覆盖。
  2. 将列设置为允许CURRENT_TIMESTAMP,然后在插入EF时将NULL的值显式设置为null。
  3. 正如你所看到的,这两种方法都需要一些思考来记住做某事 - 而且它已经被遗忘了。

    我还尝试使用OnModelCreating()强制使用此列的LastModified属性,但它似乎无法正常工作。

    从数据库更新模型时,EF / MySQL连接器是否可以正确识别Computed列为LastModified

1 个答案:

答案 0 :(得分:0)

我已经离开了MySQL和EF--它的实现存在一些小问题,特别是在使用ToListAsync()FirstOrDefaultAsync()等异步实现时。

如果有人沿着这条路走下去,请记住,当它出现时#39;为了工作,我认为它不够稳定,奇怪的例外,如“只读表”和#39;例如,在EF中使用异步方法时开始显示。

单独使用EF无法实现我的问题(但在SQL Server中也没有)。