尽管具有 FK 值,EF Core 6 播种数据仍会出现外键错误
EF Core 6 Seeding Data Gives Foreign Key error Despite Having FK Value
所以,我已经为此苦苦挣扎了一段时间,无法弄清楚我错过了什么。我有一个 table 包含一个名为 Skill
的实体,DataModel
看起来像这样:
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();
}
它引用了它自己的 SkillGroup
table,它看起来像这样:
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();
}
他们每个人都有自己的配置文件,看起来像这样:
技能模型
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);
}
}
技能组模型
var dataSeeds = new DataSeeds();
builder.ToTable("SkillGroups", "Skills")
.HasKey(k => k.SkillGroupId);
builder.HasData(dataSeeds.SkillGroups);
数据种子如下所示:
SkillGroupModel 种子
public List<SkillGroupModel> GetSkillGroups()
{
return new List<SkillGroupModel>()
{
new()
{
SkillGroupId = 1, Name = "Artisan", DescriptionId = SkillGroupDescriptions["Artisan"].Id
},
...
}
技能模型种子
return new List<SkillModel>()
{
new()
{
SkillId = 1,
Name = "Aesthetics",
DescriptionId = SkillDescriptions["Aesthetics"].Id,
SkillGroupId = 1
},
...
}
所以,我显然遗漏了一些东西。 Ivan Stoev 没有像那样初始化我的导航属性,这很有帮助。
我通过不使用我的导航属性而只设置 FK 属性来解决这个问题。我想在过去我试图同时做这两件事,这导致了让我走上这条路的问题。我不确定我之前做错了什么,但在返回并再次尝试后,MSDN 上用于播种数据的文档对我来说效果很好。
所以,我已经为此苦苦挣扎了一段时间,无法弄清楚我错过了什么。我有一个 table 包含一个名为 Skill
的实体,DataModel
看起来像这样:
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();
}
它引用了它自己的 SkillGroup
table,它看起来像这样:
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();
}
他们每个人都有自己的配置文件,看起来像这样:
技能模型
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);
}
}
技能组模型
var dataSeeds = new DataSeeds();
builder.ToTable("SkillGroups", "Skills")
.HasKey(k => k.SkillGroupId);
builder.HasData(dataSeeds.SkillGroups);
数据种子如下所示:
SkillGroupModel 种子
public List<SkillGroupModel> GetSkillGroups()
{
return new List<SkillGroupModel>()
{
new()
{
SkillGroupId = 1, Name = "Artisan", DescriptionId = SkillGroupDescriptions["Artisan"].Id
},
...
}
技能模型种子
return new List<SkillModel>()
{
new()
{
SkillId = 1,
Name = "Aesthetics",
DescriptionId = SkillDescriptions["Aesthetics"].Id,
SkillGroupId = 1
},
...
}
所以,我显然遗漏了一些东西。 Ivan Stoev 没有像那样初始化我的导航属性,这很有帮助。
我通过不使用我的导航属性而只设置 FK 属性来解决这个问题。我想在过去我试图同时做这两件事,这导致了让我走上这条路的问题。我不确定我之前做错了什么,但在返回并再次尝试后,MSDN 上用于播种数据的文档对我来说效果很好。