'EF Core 6 Seeding Data Gives Foreign Key error Despite Having FK Value

So, I have struggled with this for a while now and can't figure out what I'm missing. I have a table that holds an entity called Skill and the DataModel looks like this:

public class SkillModel
{
    public SkillModel()
    {
    }

    public SkillModel(int skillId)
    {
        SkillId = skillId;
    }

    public int SkillId { get; set; } = 0;
    public string Name { get; set; } = "";
    public Guid DescriptionId { get; set; } = new();
    public int SkillGroupId { get; set; } = 0;
    public SkillGroupModel SkillGroup { get; set; } = new();
}

It references the SkillGroup which is it's own table and it looks like this:

public class SkillGroupModel
{
    public SkillGroupModel()
    {
    }

    public SkillGroupModel(int skillGroupId)
    {
        SkillGroupId = skillGroupId;
    }

    public int SkillGroupId { get; set; } = 0;
    public string Name { get; set; } = "";
    public Guid DescriptionId { get; set; } = new();
    public List<SkillModel> Skills { get; set; } = new();
}

They each have their own configuration files and the look like this:

SkillModel

public class SkillConfiguration : IEntityTypeConfiguration<SkillModel>
{
    public void Configure(EntityTypeBuilder<SkillModel> builder)
    {
        var dataSeeds = new DataSeeds();
        builder.ToTable("Skills", "Skills");
        builder.HasKey(k => k.SkillId);
        builder.HasOne(s => s.SkillGroup)
            .WithMany(s => s.Skills);
        builder.HasData(dataSeeds.Skills);
    }
} 

SkillGroupModel

var dataSeeds = new DataSeeds();
builder.ToTable("SkillGroups", "Skills")
       .HasKey(k => k.SkillGroupId);

builder.HasData(dataSeeds.SkillGroups); 

Data seeds looks like this:

SkillGroupModel Seed

public List<SkillGroupModel> GetSkillGroups()
{
    return new List<SkillGroupModel>()
    {
        new()
        {
            SkillGroupId = 1, Name = "Artisan", DescriptionId = SkillGroupDescriptions["Artisan"].Id
        },
    ...
}

SkillModel Seeds

return new List<SkillModel>()
    {
        new()
        {
            SkillId = 1,
            Name = "Aesthetics",
            DescriptionId = SkillDescriptions["Aesthetics"].Id,
            SkillGroupId = 1
        },
     ...
}


Solution 1:[1]

So, I was obviously missing something. Ivan Stoev had a great point of not initializing my navigation properties like that, and that was a great help.

I went about it by not using my navigation properties and only setting the FK Properties. I think in the past I was trying to do both and that was causing issues that took me down this path. I'm not sure what I was doing wrong before but the way the documentation for seeding data on MSDN worked fine for me after going back and trying it again.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 darthhiggy