C# 如何首先使用实现彼此为属性的类为代码种子?

C# 如何首先使用实现彼此为属性的类为代码种子?,c#,entity-framework,model-view-controller,ef-code-first,C#,Entity Framework,Model View Controller,Ef Code First,下面是我希望在一个有歌曲专辑的网站上拥有的两个类,但我不确定如何使用seed方法。关于这个问题,我已经读了很多书,但到目前为止,我还没有发现这种情况。这将很容易解决没有专辑作为一个属性,因为我可以种子的歌曲第一,但我真的想要专辑属性。事实上,如果我可以删除albumId并只保留Album属性,那也会很好,尽管我不确定如果没有albumId属性,外键关系将如何强制执行。 我相信有一个简单的答案,但我很惊讶很难找到一个这样的例子。 下面是我想要的两个课程: public class Album {

下面是我希望在一个有歌曲专辑的网站上拥有的两个类,但我不确定如何使用seed方法。关于这个问题,我已经读了很多书,但到目前为止,我还没有发现这种情况。这将很容易解决没有专辑作为一个属性,因为我可以种子的歌曲第一,但我真的想要专辑属性。事实上,如果我可以删除albumId并只保留Album属性,那也会很好,尽管我不确定如果没有albumId属性,外键关系将如何强制执行。 我相信有一个简单的答案,但我很惊讶很难找到一个这样的例子。 下面是我想要的两个课程:

public class Album
{
    public Album()
    {
        Songs = new List<Song>();
    }
    public int AlbumId { get; set; }
    public int ReleaseYear { get; set; }
    public int NumberOfTracks { get; set; }
    public string Artist { get; set; }
    public string Name { get; set; }
    public ICollection<Song> Songs { get; set; }
}

public class Song
{
    public int SongId { get; set; }
    public int TrackNumber { get; set; }
    public string Name { get; set; }
    public List<string> Composers { get; set; }
    public List<string> FeaturedArtists { get; set; }
    public List<string> Producers { get; set; }
    public Album Album { get; set; }
    public int? AlbumId { get; set; }
}
这是我的不完全种子方法:

protected override void Seed(IQsLab.Models.ApplicationDbContext context)
    {
        context.Albums.AddOrUpdate(
          p => p.Artist,
          new Album { 
              Artist = "Linguistics",
              Name = "The Writes of Passage",
              NumberOfTracks = 17,
              ReleaseYear = 2007,
              AlbumId = 1,
              Songs = new List<Song>()
              {
                  new Song{
                      TrackNumber = 1,
                      AlbumId = 1,
                      Album = ??????????????????????????????????????,
                      Name = "Glory",
                      Composers = new List<string>(){
                          "Bobby Ruckuss"
                      },
                      Producers = new List<string>(){
                          "Bobby Ruckuss"
                      },
                      FeaturedArtists = new List<string>{
                          "Dj Solo",
                          "DJ Step 1"
                      }
                  },
                  new Song{
                      TrackNumber = 2,
                      Name = "Children of Atlantis",
                      Composers = new List<string>(){
                          "Bobby Ruckuss"
                      },
                      Producers = new List<string>(){
                          "Bobby Ruckuss"
                      }
                  },
                  new Song{
                      TrackNumber = 3,
                      Name = "On the Grind",
                      Composers = new List<string>(){
                          "Dan Kemp"
                      },
                      Producers = new List<string>(){
                          "Dan Kemp"
                      }
                  },
                  new Song{
                      TrackNumber = 4,
                      Name = "No Turnin Back",
                      Composers = new List<string>(){
                          "Bobby Ruckuss"
                      },
                      Producers = new List<string>(){
                          "Bobby Ruckuss"
                      },
                      FeaturedArtists = new List<string>{
                          "Tassa"
                      }
                  },
                  new Song{
                      TrackNumber = 5,
                      Name = "How Many",
                      Composers = new List<string>(){
                          "Bobby Ruckuss"
                      },
                      Producers = new List<string>(){
                          "Bobby Ruckuss"
                      }
                  },
                  new Song{
                      TrackNumber = 6,
                      Name = "Have Faith",
                      Composers = new List<string>(){
                          "Dan Kemp"
                      },
                      Producers = new List<string>(){
                          "Dan Kemp"
                      }
                  },
                  new Song{
                      TrackNumber = 7,
                      Name = "Mozart's Finest",
                      Composers = new List<string>(){
                          "Bobby Ruckuss"
                      },
                      Producers = new List<string>(){
                          "Bobby Ruckuss"
                      },
                      FeaturedArtists = new List<string>{
                          "Dj Solo",
                          "2Mex"
                      }
                  },
                  new Song{
                      TrackNumber = 8,
                      Name = "The Museum",
                      Composers = new List<string>(){
                          "Dan Kemp"
                      },
                      Producers = new List<string>(){
                          "Dan Kemp"
                      },
                      FeaturedArtists = new List<string>{
                          "DJ 3rdi"
                      }
                  },
                  new Song{
                      TrackNumber = 9,
                      Name = "Broken Tongues",
                      Composers = new List<string>(){
                          "Anno Domini"
                      },
                      Producers = new List<string>(){
                          "Anno Domini"
                      }
                  },
                  new Song{
                      TrackNumber = 10,
                      Name = "Politics",
                      Composers = new List<string>(){
                          "Kasper"
                      },
                      Producers = new List<string>(){
                          "Kasper"
                      }
                  },
                  new Song{
                      TrackNumber = 11,
                      Name = "The Music Is Ours",
                      Composers = new List<string>(){
                          "Bobby Ruckuss"
                      },
                      Producers = new List<string>(){
                          "Bobby Ruckuss"
                      }
                  },
                  new Song{
                      TrackNumber = 12,
                      Name = "It's Us",
                      Composers = new List<string>(){
                          "Bobby Ruckuss"
                      },
                      Producers = new List<string>(){
                          "Bobby Ruckuss"
                      },
                      FeaturedArtists = new List<string>{
                          "2Mex"
                      }
                  },
                  new Song{
                      TrackNumber = 13,
                      Name = "Where Did Hip-hop Go?",
                      Composers = new List<string>(){
                          "Dan Kemp"
                      },
                      Producers = new List<string>(){
                          "Dan Kemp"
                      }
                  },
                  new Song{
                      TrackNumber = 14,
                      Name = "Tha Realness",
                      Composers = new List<string>(){
                          "Kasper"
                      },
                      Producers = new List<string>(){
                          "Kasper"
                      }
                  },
                  new Song{
                      TrackNumber = 15,
                      Name = "How To Make It",
                      Composers = new List<string>(){
                          "Bobby Ruckuss"
                      },
                      Producers = new List<string>(){
                          "Bobby Ruckuss"
                      }
                  },
                  new Song{
                      TrackNumber = 16,
                      Name = "A Warrior's Ballad",
                      Composers = new List<string>(){
                          "Bobby Ruckuss"
                      },
                      Producers = new List<string>(){
                          "Bobby Ruckuss"
                      },
                      FeaturedArtists = new List<string>{
                          "Tassa"
                      }
                  },
                  new Song{
                      TrackNumber = 17,
                      Name = "Multiple Choice",
                      Composers = new List<string>(){
                          "Bobby Ruckuss"
                      },
                      Producers = new List<string>(){
                          "Bobby Ruckuss"
                      }
                  }
              }
          }
        );

    }

因此,基本上,如何设置Album=ThisAlbumImCreating立即开始?

您只需创建相册和歌曲,设置它们之间的关系并调用save changes。DbContext将为您自动完成其余的更改跟踪/关系修复。这就是为什么ORM很有趣

protected override void Seed(IQsLab.Models.ApplicationDbContext context)
{
   Album album1 = new Album { /* ... */ };
   Album album2 = new Album { /* ... */ };
   Album album3 = new Album { /* ... */ };

   Song1_1 = new Song { /* ... */ };
   Song1_2 = new Song { /* ... */ };
   Song1_3 = new Song { /* ... */ };

   // ...

   Album1.Songs.Add(Song1_1);
   Album1.Songs.Add(Song1_2);
   Album1.Songs.Add(Song1_3);

   // ...

   context.Albums.Add(Album1);
   context.Albums.Add(Album2);
   context.Albums.Add(Album3);

   // ...

   context.SaveChanges();

 }
注意1:context.Albums.AddAlbumN方法不仅将AlbumN附加到db上下文,还将其所有子对象附加到db上下文。他们都得到了国家的支持

注2:调用SaveChanges时,EF会注意恢复实体(例如Album1)的PK,并修复所有相关子级的关系。在这种情况下,这意味着将所有歌曲1的FK设置为插入相册1时恢复的PK

顺便说一下,除非另行配置,否则默认EF约定将在数据库中实现int PKs作为标识,因此它们将自动生成。我假设您没有使用属性、fluentapi或自定义约定对模型进行微调


因此,这比您预期的要容易得多。

EF只需插入一个AlbumId,这就是他所需要的。尝试查询歌曲并检查EF是否填充了唱片集属性。谢谢,我知道这是一个解决方案,但这是一个我不喜欢的解决方案。如果这是唯一可用的解决方案,那就这样吧。我只是删除相册属性,或者不在seed方法中设置它,但我希望有人有一种创造性的方法,我可以按照我想要的方式进行种子设置,并将该相册属性作为类的一部分,因为它以后可能会派上用场。当从数据库具体化检索实体时,EF会在相册上放置一个正确的引用,那你以后可以用了嗯,好的,谢谢。我是新来的代码第一,所以我想我会停止尝试设置每首歌曲的专辑属性,只使用专辑ID。非常感谢。