我正在通过代码第一个方法使用.NET Core 2,EF Core和MySQL作为数据库服务器的应用程序。
我有2个表:
- 用户
- 员工
用户表是包含用户信息和员工表的主表,是子表,该表具有列ID_USER,如下所示:
public class User : BaseEntity
{
public int ID_User { get; set; }
public string Name { get; set; }
public string UserName { get; set; }
public string Password { get; set; }
public virtual ICollection<Employee> Employees{get;set;}
}
public class Employee : Entity
{
public int ID_Employee { get; set; }
public string Name { get; set; }
public int ID_User { get; set; }
public virtual User User { get; set; }
}
当我使用上述映射时,一切都可以很好地工作,并且在两个表中都有足够的数据。
现在,我想在员工表中制作列 id_user nullable
要实施此更改,我在更改模型之后做出了:
public class Employee : Entity
{
public int ID_Employee { get; set; }
public string Name { get; set; }
public int? ID_User { get; set; }
public virtual User User { get; set; }
}
和映射文件:
builder.HasOne(x=>x.User).WithMany(y=>y.Employees).HasForeignKey(z=>z.ID_User).IsRequired(false);
运行dotnet ef migrations add empuser
命令后,它生成以下迁移代码:
migrationBuilder.DropForeignKey(
name: "FK_Employee_User_ID_User",
table: "Employee");
migrationBuilder.AlterColumn<int>(
name: "ID_User",
table: "Employee",
nullable: true,
oldClrType: typeof(int));
migrationBuilder.AddForeignKey(
name: "FK_Employee_User_ID_User",
table: "Employee",
column: "ID_User",
principalTable: "User",
principalColumn: "ID_User",
onDelete: ReferentialAction.Restrict);
现在,当我运行dotnet ef database update
时,它会给我以下错误:
您在SQL语法中有错误;检查手册 对应于您的MySQL Server版本,以供正确的语法使用 第1行的"约束
FK_Employee_User_ID_User
"接近
请帮助。
谢谢
尝试将SQL语句直接放入MySQL Workbench。
- 在您的命令prompt中键入" dotnet ef迁移脚本"。
- 复制生成的SQL脚本。
- 将其粘贴到您的工作台上。
- 检查错误发生的位置。
当我使用MySQL使用EF Core 2遇到类似的错误时,这有助于我更好地理解问题并帮助解决问题。(对我来说,这是一个打字错误(。您至少可以使用此方法来确定它是迁移或SQL语句中的错误。
我知道这不是具体的解决方案,但我希望这会帮助您理解您的问题并解决问题:(
您是否检查了数据库中的外键名?
我发现了迁移构建器的错误,其中创建了新表:
在我的情况下,我使用EF Core 2.1 mySQL dotnet连接器错误
迁移构建器创建错误命名为外键名的地方...
避免使用错误命名的外键名:
修复迁移构建器
如果您的外键命名错误,则可以在数据库中手动重命名它,然后您的迁移可能起作用。
对于某些版本的mySQL不支持关键字约束。EF Core会产生掉落外键的下降约束。我必须更改以下内容: -
migrationBuilder.DropForeignKey(
name: "FK_XXXXX",
table: "XXXXXX");
to
migrationBuilder.Sql("ALTER TABLE XXXXXX DROP FOREIGN KEY FK_XXXXX");