mysql - MySqlException:自引用表上的“外键约束格式错误”
问题描述
我想创建一个菜单项表,其中每个项目都有一个父项和一组子项。EF Core 3.1 处理迁移正常,但是更新数据库时,MySql 抛出错误:
Failed executing DbCommand (21ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
CREATE TABLE `MenuItem` (
`Id` varchar(255) CHARACTER SET utf8mb4 NOT NULL,
`Created` datetime(6) NOT NULL,
`Updated` datetime(6) NOT NULL,
`Name` longtext CHARACTER SET utf8mb4 NULL,
`Link` longtext CHARACTER SET utf8mb4 NULL,
`IconId` varchar(255) CHARACTER SET utf8mb4 NULL,
`ParentId` varchar(255) CHARACTER SET utf8mb4 NULL,
`IsLong` tinyint(1) NOT NULL,
`Type` int NOT NULL,
`Published` tinyint(1) NOT NULL,
`OrderIndex` int NOT NULL,
CONSTRAINT `PK_MenuItem` PRIMARY KEY (`Id`),
CONSTRAINT `FK_MenuItem_File_IconId` FOREIGN KEY (`IconId`) REFERENCES `File` (`Id`) ON DELETE RESTRICT,
CONSTRAINT `FK_MenuItem_MenuItem_ParentId` FOREIGN KEY (`ParentId`) REFERENCES `MenuItem` (`Id`) ON DELETE RESTRICT
);
MySql.Data.MySqlClient.MySqlException (0x80004005): Can't create table `x`.`MenuItem` (errno: 150 "Foreign key constraint is incorrectly formed")
---> MySql.Data.MySqlClient.MySqlException (0x80004005): Can't create table `x`.`MenuItem` (errno: 150 "Foreign key constraint is incorrectly formed")
at MySqlConnector.Core.ResultSet.ReadResultSetHeaderAsync(IOBehavior ioBehavior) in C:\projects\mysqlconnector\src\MySqlConnector\Core\ResultSet.cs:line 49
菜单项实体:
public class MenuItemEntity : Entity, IOrderedEntity, IPublishableEntity
{
public MenuItemEntity()
{
Children = new List<MenuItemEntity>();
}
public string Id { get; set; }
public DateTime Created { get; set; }
public DateTime Updated { get; set; }
public string Name { get; set; }
public string Link { get; set; }
public FileEntity Icon { get; set; }
[ForeignKey("ParentId")]
public virtual MenuItemEntity Parent { get; set; }
public virtual ICollection<MenuItemEntity> Children { get; set; }
public bool IsLong { get; set; }
public MenuItemsType Type { get; set; }
public bool Published { get; set; }
public int OrderIndex { get; set; }
public override string ToString()
{
return Name;
}
}
解决方案
删除数据库并再次运行dotnet ef database update
解决了问题,但这不是生产的解决方案。
推荐阅读
- python - 从 np.datetime64 转换为浮点年
- google-bigquery - 如何根据数组条件加入 2 个表包含
- vue.js - 在 Gridsome 中生成文档索引
- xamarin.forms - 如何更改所选项目的颜色?
- android - Android Firebase Datasnapshot - 空对象错误
- android - 未收到通知,但在 Android 中使用 Firebase 和 Retrofit2 似乎发送成功
- reactjs - 动作正在更新状态,但来自 mapStateToProps 的道具在组件中显示为未定义
- firebase - 移至 FCM 旧版 HTTP API
- xml - 填充视口所需的最简单的 svg 代码
- javascript - KonvaJS - 如何使用按钮触发器添加形状?