C# - 外键引用无效表 - 基本迁移不起作用

本文关键字:不起作用 迁移 无效 引用 | 更新日期: 2023-09-27 18:28:14

尝试用 C# 制作我的第一个项目。然而,到目前为止,这非常令人沮丧。这是我无法解决的问题,因为我没有看到任何错误。

我正在尝试在我的数据库中进行简单的迁移。

用户迁移文件

 public override void Up()
        {
            CreateTable(
                "dbo.Users",
                c => new
                    {
                        user_id = c.Int(nullable: false, identity: true),
                        first_name = c.String(),
                        last_name = c.String(),
                        email = c.String(),
                        role = c.String(),
                    })
                .PrimaryKey(t => t.user_id);
        }

位置迁移文件

 public override void Up()
        {
            CreateTable(
                "dbo.Locations",
                c => new
                {
                    loc_id = c.Int(nullable: false, identity: true),
                    loc_name = c.String(),
                })
            .PrimaryKey(t => t.loc_id);
            CreateTable(
                "dbo.UserLoc",
                c => new
                {
                    ul_id = c.Int(nullable: false, identity: true),
                    fk_user_id = c.Int(nullable: false),
                    fk_loc_id = c.Int(nullable: false),
                })
            .PrimaryKey(t => t.ul_id);
            AddForeignKey("dbo.UserLoc", "fk_user_id", "dbo.Users", "user_id");
            AddForeignKey("dbo.UserLoc", "fk_loc_id", "dbo.Locations", "loc_id");
        }

模型:

用户.cs

public class User
{
    [Key]
    public int user_id { get; set; }
    public string firs_tname { get; set; }
    public string last_name { get; set; }
    public string email { get; set; }
    public string role { get; set; }
}

位置.cs

public class Locations
{
    [Key]
    public int loc_id { get; set; }
    public int loc_name { get; set; }
}

用户定位.cs

public class UserLoc
{
    [Key]
    public int ul_id { get; set; }
    [ForeignKey("Users")]
    public int fk_user_id { get; set; }
    public virtual User user { get; set; }
    [ForeignKey("Locations")]
    public int fk_location_id { get; set; }
    public virtual Locations location { get; set; }
}

每次我想迁移时都收到相同的错误

外键'FK_dbo。UserLoc_dbo。Users_fk_user_id的引用无效 表'dbo。用户'。无法创建约束或索引。请参阅上一页 错误。

我做错了什么?

C# - 外键引用无效表 - 基本迁移不起作用

首先,

我建议您更改在导航属性名称的ForeignKey属性中使用的 FK 名称:

public class UserLoc
{
    [Key]
    public int ul_id { get; set; }
    [ForeignKey("user")]
    public int fk_user_id { get; set; }
    public virtual User user { get; set; }
    [ForeignKey("location")]
    public int fk_location_id { get; set; }
    public virtual Locations location { get; set; }
}

这样,您就可以告诉它哪个导航属性表示它是外键的关系。

之后,删除旧迁移并尝试再次运行Add-Migration命令重新生成它。现在您应该看到CreateIndex方法在该方法之前调用AddForeignKey

CreateIndex("dbo.UserLoc", "fk_user_id");
AddForeignKey("dbo.UserLoc", "fk_user_id", "dbo.Users", "user_id");
CreateIndex("dbo.UserLoc", "fk_loc_id");
AddForeignKey("dbo.UserLoc", "fk_loc_id", "dbo.Locations", "loc_id");

我最近遇到了这个问题。

我删除了

所有迁移,运行了几次删除迁移以清理一些默认 ASP.Net 身份迁移,然后从头开始重新创建迁移。

实体框架核心将 IdentityUser 类的默认基架与我的自定义实现混淆了,因此当我创建与其相关的表(在本例中为引用(时,它找不到表 ASPNetUsers。

使用数据库中内置标识的 EF Core 时,请务必清除任何默认迁移并运行删除迁移。

希望这对任何困惑的人有所帮助。