假设我具有以下实体:
public class Artist
{
[Key]
public Guid Id { get; set; }
[Required]
public string Name { get; set; }
}
public class Song
{
[Key]
public Guid Id { get; set; }
[Required]
public string Name { get; set; }
[Required]
public Artist Artist { get; set; }
}
对于Song
类,我试图创建一个种子,例如:
modelBuilder.Entity<Song>().HasData(new Song
{
Id = Guid.NewGuid(),
Name = "test",
Artist = new Artist
{
Id = Guid.NewGuid(),
Name = "test"
}
});
这将引发以下错误:
无法添加实体类型“ Song”的种子实体,因为没有为必需的属性“ ArtistId”提供值。
我不知道为什么总是出现此错误。当我尝试仅播种Artist
对象时,没有任何问题。我还尝试引用现有的Artist
对象,但是引用的结果相同。
编辑:我忘了提到代码确实可以运行,但是当尝试通过Add-Migration InitialCreate
命令创建迁移时,会显示错误。
答案 0 :(得分:3)
我找到了使用匿名对象(new {}
)的解决方案。问题是我的Song
对象没有包含Guid ArtistId
属性,而是包含了Artist Artist
属性。但是,由于某些原因,EF迁移无法与此对象关联,而需要一个id。对于匿名对象,可以这样修复:
modelBuilder.Entity<Song>().HasData(new //No Song object here.
{
Id = Guid.NewGuid(),
Name = "test",
ArtistId = artist.Id
});
现在我可以运行迁移了。
更新:
我认为现在更容易插入种子数据的方法是生成一个空迁移并通过migrationBuilder.Sql()
方法添加数据。
答案 1 :(得分:0)
同意@vivek nuna 首先播入Artist,然后播入Song,请在播种时使用ArtistId。
var artist = new Artist()
{
Id = Guid.NewGuid(),
Name = "test-a"
};
modelBuilder.Entity<Artist>().HasData(artist);
modelBuilder.Entity<Song>().HasData(new Song()
{
Id = Guid.NewGuid(),
Name = "test",
ArtistId = artist.Id
});
我可以使用“添加迁移”命令添加迁移。