我正在开发一个应用程序,我通过Code First方法使用.Net Core 2,EF Core和MySQL作为数据库服务器。
我有两张桌子:
用户表是包含用户信息的主表,而Employee表是具有列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; }
}
当我使用上面的映射时,一切都很完美,我在两个表中都有足够的数据。
现在,我想将Employee表中的 ID_User 列设为可以为空
为了实现这一改变,我对我的模型进行了以下更改:
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服务器版本,以便使用正确的语法 靠近&#39; CONSTRAINT
FK_Employee_User_ID_User
&#39;在第1行
请帮忙。
由于
答案 0 :(得分:4)
尝试将SQL语句直接放入MySQL Workbench。
当我使用EF核心2与MySQL进行类似的错误时,这有助于我更好地理解问题并帮助解决问题。 (对我来说这是打字错误)。您至少可以使用此方法来确定它是迁移中还是SQL语句中的错误。
我知道这不是具体的解决方案,但我希望这能帮助您理解并解决问题:)
答案 1 :(得分:0)
您是否已检查数据库中的外键名称?
我从迁移生成器中发现了一个错误,该错误在其中创建新表:
In my case I use EF Core 2.1 Mysql DotNet Connector bug
迁移构建器在其中创建了错误命名的外键名称...
为避免此错误命名的外键名称:
如果外键命名错误,则可以在数据库中手动重命名外键,然后进行迁移。
答案 2 :(得分:0)
某些版本的 MYSQL 不支持关键字 CONSTRAINT。 EF 核心为删除外键生成删除约束。我必须更改以下内容:-
migrationBuilder.DropForeignKey(
name: "FK_XXXXX",
table: "XXXXXX");
到
migrationBuilder.Sql("ALTER TABLE XXXXXX DROP FOREIGN KEY FK_XXXXX");