种子方法无法添加外键对象

时间:2016-05-12 21:55:35

标签: c# asp.net-mvc entity-framework

我正在为拥有球员的足球队创建一个数据库。我使用种子方法添加我的数据,但实体框架不会更新我的数据库,抛出对象引用未设置为对象的实例。错误。

我不确定如何链接种子方法中的关系。下面是代码。

种子方法

protected override void Seed(DataLayer.FootballContext context)
 {
        List<VoetbalPloeg> VoetbalPloegModels = new List<VoetbalPloeg>();

        VoetbalPloegModels.Add(new VoetbalPloeg()
        {
            PloegNaam = "FC Barcelona",
            StamNummer = 1241,
            Spelers =
            {
                new Speler() { VoorNaam = "Lionel", AchterNaam = "Messi", Assists = 2, Goals = 15, GeboorteDatum = new DateTime(1990, 05, 15), Positie = "Spits", Rugnummer = 10},
                new Speler() { VoorNaam = "Alonso", AchterNaam = "Xabi", Assists = 3, Goals = 7, GeboorteDatum = new DateTime(1985, 04, 24), Positie = "Centraal", Rugnummer = 13}
            }
        });

        VoetbalPloegModels.Add(new VoetbalPloeg()
        {
            PloegNaam = "Real Madrid",
            StamNummer = 1546,
            Spelers =
            {
                new Speler() { VoorNaam = "Cristano", AchterNaam = "Ronaldo", Assists = 0, Goals = 17, GeboorteDatum = new DateTime(1989, 10, 7), Positie = "Spits", Rugnummer = 7},
                new Speler() { VoorNaam = "Sergio", AchterNaam = "Ramos", Assists = 0, Goals = 4, GeboorteDatum = new DateTime(1986, 12, 04), Positie = "LaatsteMan", Rugnummer = 10}
            }
        });

        foreach (var item in VoetbalPloegModels)
            context.VoetbalPloeg.Add(item);

        base.Seed(context);
 }

玩家模型

public class Speler
{
    [Key]
    public int SpelerId { get; set; }
    public string VoorNaam { get; set; }
    public string AchterNaam { get; set; }
    public int Rugnummer { get; set; }
    public string Positie { get; set; }
    public int Goals { get; set; }
    public int Assists { get; set; }
    public DateTime GeboorteDatum { get; set; }

    // Forgein Key
   // public int VoetbalPloegId { get; set; }

    // Navigation Property
   //public virtual VoetbalPloeg VoetbalPloeg { get; set; }

}

足球队模型

public class VoetbalPloeg
{
    [Key]
    public int VoetbalPloegId { get; set; }
    public string PloegNaam { get; set; }
    public int StamNummer { get; set; }

    public virtual ICollection<Speler> Spelers { get; set; }
}

编辑:标记为答案的问题是您在键入我的常规错误消息时在Google中获得的第一个结果。

1 个答案:

答案 0 :(得分:1)

如果您正在迁移文件夹中的Configuration.cs运行种子,请使用:

 public Configuration()
 {
    AutomaticMigrationsEnabled = true;
 }

 protected override void Seed(TestContext context)
    {
        // Where 'VoetbalPloegs' is the name of your table in the dbcontext

        context.Spelers.AddOrUpdate(x => x.Id,
            new Speler() { Id = 1, VoorNaam = "Lionel", AchterNaam = "Messi", Assists = 2, Goals = 15, GeboorteDatum = new DateTime(1990, 05, 15), Positie = "Spits", Rugnummer = 10, VoetbalPloegId = 1 },
            new Speler() { Id = 2, VoorNaam = "Alonso", AchterNaam = "Xabi", Assists = 3, Goals = 7, GeboorteDatum = new DateTime(1985, 04, 24), Positie = "Centraal", Rugnummer = 13, VoetbalPloegId = 1},
            new Speler() { Id = 3, VoorNaam = "Cristano", AchterNaam = "Ronaldo", Assists = 0, Goals = 17, GeboorteDatum = new DateTime(1989, 10, 7), Positie = "Spits", Rugnummer = 7, VoetbalPloegId = 2 },
            new Speler() { Id = 4, VoorNaam = "Sergio", AchterNaam = "Ramos", Assists = 0, Goals = 4, GeboorteDatum = new DateTime(1986, 12, 04), Positie = "LaatsteMan", Rugnummer = 10, VoetbalPloegId = 2}
            );

        context.VoetbalPloegs.AddOrUpdate(x => x.Id,
            new VoetbalPloeg() { Id = 1, PloegNaam = "FC Barcelona", StamNummer = 1241 },
            new VoetbalPloeg() { Id = 2, PloegNaam = "Real Madrid", StamNummer = 1546 }
           );
    }

确保自动迁移设置为true(如上所述)。

Speler实体:

 public class Speler
{
    public int Id { get; set; }
    public string VoorNaam { get; set; }
    public string AchterNaam { get; set; }
    public int Rugnummer { get; set; }
    public string Positie { get; set; }
    public int Goals { get; set; }
    public int Assists { get; set; }
    public DateTime GeboorteDatum { get; set; }

    // Forgein Key
    public int VoetbalPloegId { get; set; }
}

VoetbalPloeg实体:

public class VoetbalPloeg
{
    public int Id { get; set; }
    public string PloegNaam { get; set; }
    public int StamNummer { get; set; }

    public virtual ICollection<Speler> Spelers { get; set; }
}

在DbContext中添加:

public DbSet<Speler> Spelers { get; set; }
    public DbSet<VoetbalPloeg> VoetbalPloegs { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {

        base.OnModelCreating(modelBuilder);

        modelBuilder.Entity<VoetbalPloeg>().HasMany(s => s.Spelers).WithRequired().HasForeignKey(h => h.VoetbalPloegId);

    }