我们首先使用代码来管理使用时态表的数据库。在几次迁移之后,我遇到了一个问题,基本上我们需要使一个列为空,因为原始数据字典是不正确的。
当我尝试运行Update-Database时,它返回一个错误:
将SYSTEM_VERSIONING设置为ON失败,因为'MyColumn‘列在表'MYDB.dbo.TableName’和‘MYDB.dbot.ableNameHistory’中没有相同的空属性。
似乎migrationBuilder正在创建新的列定义,但这并不适用于历史表.
在SQL中,您只需运行一个ALTER命令,它就可以更新历史表,但是我找不到修改EF中的时态表的任何文档。一切都是为了创造它们。
我们是否需要做一些具体的工作来完成这项工作,或者这是EF Core 6中的一个bug?
发布于 2022-12-02 02:55:37
当使用实体框架核心(EF Core)管理使用时态表的数据库时,需要确保基表中的列和历史表中的列的空属性相同。这是因为feature使用Server中的SYSTEM_VERSIONING功能来启用时态表,而Server要求基表和历史表中列的空值属性是相同的,以便启用SYSTEM_VERSIONING功能。
要修复所看到的错误,需要更新历史表中MyColumn列的nullability属性,以匹配基表中MyColumn列的空值属性。在迁移过程中,您可以使用常规的SQL ALTER TABLE语句来实现这一点,如下所示:
migrationBuilder.Sql(
    "ALTER TABLE dbo.TableNameHistory ALTER COLUMN MyColumn int NULL"
);这将更新历史表中MyColumn列的空性属性,以便它与基表中MyColumn列的空值属性相匹配。然后,当您运行Update-Database命令时,它不应该返回一个错误,SYSTEM_VERSIONING特性将被成功地启用。
发布于 2022-12-02 23:12:18
要解决这个问题,您需要确保所需的列在两个表中都具有相同的空属性。您可以通过运行如下所示的SQL查询来做到这一点:
ALTER TABLE [MYDB].[dbo].[TableName] ALTER COLUMN [MyColumn] [data type] NULL;
ALTER TABLE [MYDB].[dbo].[TableNameHistory] ALTER COLUMN [MyColumn] [data type] NULL;发布于 2022-12-03 00:48:50
看起来您遇到了实体框架核心6和时态表的问题。在实体框架核心6中,migrationBuilder不支持修改时态表。这意味着您将无法使用migrationBuilder对时态表进行所需的更改。
一个选项是使用原始SQL查询手动修改表。可以使用migrationBuilder.Sql方法执行将修改时态表的原始SQL查询。下面是一个如何做到这一点的例子:
migrationBuilder.Sql("ALTER TABLE MYDB.dbo.TableName ALTER COLUMN MyColumn INT NULL");或者,您可以尝试升级到支持修改时态表的实体框架核心的更新版本。在EntityFrameworkCore6.4和更高版本中,migrationBuilder支持使用HasPeriod和HasHistory方法修改时态表。
我希望这能帮到你!如果你还有其他问题,请告诉我
https://stackoverflow.com/questions/74551985
复制相似问题