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