错误:无法添加或更新子行:外键约束失败

时间:2019-04-01 10:39:31

标签: mysql ef-core-2.0

我仍在学习EF Core,并且在尝试仅将用户数据(没有BusinessUserProfile和BusinessCompany)插入数据库时​​遇到错误。我有以下表格:User,BusinessUserProfile和BusinessCompany。关系是:用户具有一个BusinessUserProfile,BusinessCompany具有多个BusinessUserProfile。

我的班级是这样创建的:

用户模型类:

public class User
{
    public int Id { get; set; }
    public string Username { get; set; }

    public BusinessUserProfile BusinessUserProfile { get; set; }

    public User()
    {
        BusinessUserProfile = new BusinessUserProfile();
    }
}

BusinessUserProfile模型类:

public class BusinessUserProfile
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }

    public BusinessCompany BusinessCompany { get; set; }
    public int BusinessCompanyId { get; set; }

    public User User { get; set; }
    public int UserId { get; set; }
}

}

BusinessCompany模型类别:

public class BusinessCompany
{
    public int Id { get; set; }
    public string Name { get; set; }

    public ICollection<BusinessUserProfile> BusinessUserProfiles { get; set; }

    public BusinessCompany()
    {
        BusinessUserProfiles = new Collection<BusinessUserProfile>();
    }
}

DataContext.cs:

modelBuilder.Entity<User>()
            .HasOne(u => u.BusinessUserProfile)
            .WithOne(bup => bup.User)
            .HasForeignKey<BusinessUserProfile>(bup => bup.UserId);

modelBuilder.Entity<BusinessCompany>()
            .HasMany(bc => bc.BusinessUserProfiles)
            .WithOne(bup => bup.BusinessCompany)
            .HasForeignKey(bup => bup.BusinessCompanyId);

当我向数据库添加用户时,出现错误: MySqlException:无法添加或更新子行:外键约束失败(mydbbusinessuserprofiles,CONSTRAINT FK_BusinessUserProfiles_BusinessCompanies_BusinessCompanyId外部键(BusinessCompanyId)参考businesscompaniesid)删除C)。

有人可以建议我吗?

2 个答案:

答案 0 :(得分:0)

这种类型的错误通常是在子表具有指向由于某种原因而不再存在的父记录的外键记录时引起的。在您的特定情况下,通常意味着BusinessUserProfile表中存在一个或多个记录,这些记录指的是BusinessCompany表中不再存在的记录。

这是一个查询,您可以运行该查询以标记一些孤立的子记录:

SELECT *
FROM BusinessUserProfile bup
WHERE NOT EXISTS (SELECT 1 FROM BusinessCompany bc
                  WHERE bc.id = bup.BusinessCompanyId);

如果该查询显示记录,则说明您的观察结果。如果没有,那么至少您可以排除这种可能性。

答案 1 :(得分:0)

您在User类中制造了所需的BusinessUserProfile。因此,如果您尝试创建没有现有BusinessUserProfile的用户,则就像尝试插入null fk一样。你不允许的。