当我尝试添加迁移时,出现以下异常:
无法添加实体类型“流派”的种子实体,因为它设置了导航“ SubGenres”。要建立关系种子,您需要将相关实体种子添加到“流派”并指定外键值{'ParentId'}
如何在EntityFrameworkCore 2.2
内正确设置种子
我有下一个实体
public class Genre
{
[Key] public int Id { get; set; }
[Required] [MaxLength(50)] public string Name { get; set; }
public virtual ICollection<GameGenre> GameGenre { get; set; } = new List<GameGenre>();
public int? ParentId { get; set; }
public virtual Genre ParentGenre { get; set; }
public virtual ICollection<Genre> SubGenres { get; set; } = new List<Genre>();
}
DbContext
public class OnlineGameContext : DbContext
{
public OnlineGameContext(DbContextOptions<OnlineGameContext> options)
: base(options)
{
}
public DbSet<Genre> Genres { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder
.Entity<Genre>()
.HasMany(u => u.SubGenres)
.WithOne(p => p.ParentGenre)
.HasForeignKey(p => p.ParentId);
modelBuilder.Entity<Genre>().HasData(DefaultGenresFactories.Action);
base.OnModelCreating(modelBuilder);
}
}
工厂
public static class DefaultGenresFactories
{
public static Genre Action =>
new Genre
{
Id = 5,
Name = "Action",
SubGenres = DefaultSubGenresFactories.Action
};
}
public static class DefaultSubGenresFactories
{
public static ICollection<Genre> Action => new List<Genre>
{
new Genre
{
Id = 15,
Name = "FPS",
ParentId = 5
},
new Genre
{
Id = 16,
Name = "TPS",
ParentId = 5
},
new Genre
{
Id = 17,
Name = "Misc",
ParentId = 5
}
};
}
答案 0 :(得分:2)
该异常消息告诉您使用HasData
方法进行播种时不能使用导航属性,而只能通过FK属性指定关系。
换句话说,您不能使用SubGenres
和ParentGenre
导航属性来指定关系,只能通过ParentId
属性来指定它们。
因此删除
SubGenres = DefaultSubGenresFactories.Action
行,或者将DefaultSubGenresFactories.Action
和DefaultGenresFactories.Action
合并到Genre
的单个列表中,并在HasData
调用中使用该列表,或者如果您想保留{ {1}}和DefaultGenresFactories
类与当前的类分开,只需为两者(其附加)调用DefaultSubGenresFactories
:
HasData