我正在浏览来自 www.ASP.net 网站的 Mvc 音乐商店教程。
我无法理解 Entity Framework 如何创建表以及这些 lambda 表达式是如何工作的。我确实了解 EF 和 Lambda 的基础知识,并且我已经完成了本系列之前的教程。
我的问题与教程的第 4 部分有关:第 4 部分:模型和数据访问模型 中有三个类:艺术家、流派和专辑,如下所示。
public class Artist
{
public int ArtistId { get; set; }
public string Name { get; set; }
}
public partial class Genre
{
public int GenreId { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public List<Album> Albums { get; set; }
}
public class Album
{
public int AlbumId { get; set;}
public int GenreId { get; set; }
public int ArtistId { get; set; }
public string Title { get; set; }
public decimal Price { get; set; }
public string AlbumArtUrl { get; set; }
public Genre Genre { get; set; }
public Artist Artist { get; set; }
}
但是,我只看到 EF 创建的每个表的以下列。
艺术家表:ArtistId, Name
流派表:GenreId, Name, Description
专辑表:AlbumId, GenreId, ArtistId, Title, Price, AlbumArtUrl
混乱一
Artist 表很好,但 Genre 表与类定义无关List<Album> Albums
。在专辑表中public Genre Genre
并且public Artist Artist
丢失。
下面是在 SampleData.cs 文件中将默认数据添加到数据库的语句
new Album
{
Title = "A Copland Celebration, Vol. I",
Genre = genres.Single(g => g.Name == "Classical"),
Price = 8.99M,
Artist = artists
.Single(a => a.Name == "Aaron Copland & London Symphony Orchestra"),
AlbumArtUrl = "/Content/Images/placeholder.gif"
}
问题
现在数据库表中没有任何名称为 Genre 和 Artist 的字段??GenreId 和 ArtistId 未插入,但数据库中的专辑表填充了这些值。???
混淆二
在 StoreController 的 Browse 动作方法中,
// Retrieve Genre and its Associated Albums from database
var genreModel = storeDB.Genres.Include("Albums").Single(g => g.Name == genre);
我不知道 include 在这里是如何工作的。Genres 模型类中有 List of Albums 字段,但在数据库中没有。我猜想 include() 可能会在那里保存专辑列表。
问题
但我不明白为什么 Include 方法有“Albums”参数?有两个专辑列表,一个在 Genre 模型类中,另一个在派生自DbContext
EF 的类中。此语句将如何仅返回具有匹配流派的专辑?
任何帮助表示赞赏。谢谢