实体框架核心无法创建带有子对象和GUID的种子

时间:2018-08-05 20:36:24

标签: .net-core entity-framework-core

假设我具有以下实体:

 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命令创建迁移时,会显示错误。

2 个答案:

答案 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
});

我可以使用“添加迁移”命令添加迁移。