.Net Core2 EF MySQL在将外键列更改为可空时有问题

时间:2018-02-08 06:30:38

标签: mysql .net entity-framework asp.net-core .net-core

我正在开发一个应用程序,我通过Code First方法使用.Net Core 2,EF Core和MySQL作为数据库服务器。

我有两张桌子:

  1. 用户
  2. 员工
  3. 用户表是包含用户信息的主表,而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行

    请帮忙。

    由于

3 个答案:

答案 0 :(得分:4)

尝试将SQL语句直接放入MySQL Workbench。

  1. 在命令提示符中键入“dotnet ef migrations script”。
  2. 复制生成的SQL脚本。
  3. 将其粘贴到Workbench中。
  4. 检查错误发生的位置。
  5. 当我使用EF核心2与MySQL进行类似的错误时,这有助于我更好地理解问题并帮助解决问题。 (对我来说这是打字错误)。您至少可以使用此方法来确定它是迁移中还是SQL语句中的错误。

    我知道这不是具体的解决方案,但我希望这能帮助您理解并解决问题:)

答案 1 :(得分:0)

您是否已检查数据库中的外键名称?

我从迁移生成器中发现了一个错误,该错误在其中创建新表:

In my case I use EF Core 2.1 Mysql DotNet Connector bug

迁移构建器在其中创建了错误命名的外键名称...

为避免此错误命名的外键名称:

fix for migration builder

如果外键命名错误,则可以在数据库中手动重命名外键,然后进行迁移。

答案 2 :(得分:0)

某些版本的 MYSQL 不支持关键字 CONSTRAINT。 EF 核心为删除外键生成删除约束。我必须更改以下内容:-

migrationBuilder.DropForeignKey(
            name: "FK_XXXXX",
            table: "XXXXXX");

migrationBuilder.Sql("ALTER TABLE XXXXXX DROP FOREIGN KEY FK_XXXXX");