Entity framework 实体框架-多对多

Entity framework 实体框架-多对多,entity-framework,Entity Framework,我很难理解EF 我有两个表处于N对N的关系中。当我在VisualStudio中创建模型时,我得到的结果如下图所示 艺术家与唱片集相关,唱片集与艺术家相关。 在数据库中,我有一个表来关联这两个表 我的问题是: 为什么我可以添加一个有两张专辑的艺术家 var artist = new Artist { FirstName = "Alan", LastName = "Jackson" }; var album1 = new Album { AlbumName = "Drive" }; var alb

我很难理解EF

我有两个表处于N对N的关系中。当我在VisualStudio中创建模型时,我得到的结果如下图所示

艺术家与唱片集相关,唱片集与艺术家相关。 在数据库中,我有一个表来关联这两个表

我的问题是:

为什么我可以添加一个有两张专辑的艺术家

var artist = new Artist { FirstName = "Alan", LastName = "Jackson" };
var album1 = new Album { AlbumName = "Drive" };
var album2 = new Album { AlbumName = "Live at Texas Stadium" };
artist.Albums.Add(album1);
artist.Albums.Add(album2);
context.Artists.Add(artist);
但不能反过来做吗

var artist1 = new Artist { FirstName = "Tobby", LastName = "Keith" };
var artist2 = new Artist { FirstName = "Merle", LastName = "Haggard" };
var album = new Album { AlbumName = "Honkytonk University" };
artist1.Albums.Add(album);
artist2.Albums.Add(album);
context.Albums.Add(album);

context.SaveChanges();
这对我来说没有意义,因为VS模型中的两个表都具有正确的导航属性,添加到左侧或右侧不是相同的吗? 在我看来,在第二种情况下,EF应该将artist1和artist2添加到DB中

谢谢你的阅读。
方济各会

进一步阐述伊万的评论

在这个例子中:

var artist1 = new Artist { FirstName = "Tobby", LastName = "Keith" };
var artist2 = new Artist { FirstName = "Merle", LastName = "Haggard" };
var album = new Album { AlbumName = "Honkytonk University" };
artist1.Albums.Add(album);
artist2.Albums.Add(album);
context.Albums.Add(album);
在SaveChanges之前,album.Artists还没有设置任何内容,EF所要做的就是您在album上设置的内容

在您的例子中,您创建了2个艺术家对象和1个相册。您已将相册与艺术家关联,但仅通知EF要保存的相册。与POCOs一样,仅仅因为艺术家有一个相册,而相册又有一个艺术家,在艺术家上设置相册不会自动在相册上设置艺术家属性。如果EF看到您添加到上下文中的实体上的相关实体,它会在幕后执行此操作

因此,以下措施应该有效:

var artist1 = new Artist { FirstName = "Tobby", LastName = "Keith" };
var artist2 = new Artist { FirstName = "Merle", LastName = "Haggard" };
var album = new Album { AlbumName = "Honkytonk University" };
album.Artists.Add(artist1);
album.Artists.Add(artist2);
context.Albums.Add(album);

在调用SaveChanges之前,artist1.Album将为空,因为您尚未设置任何内容。保存更改后,artist1和2.Album将引用您的新实体,因为EF解析了相册上的艺术家集合并连接了相关引用。(即使艺术家1和2没有被明确地添加到上下文中。)

如果您想要完全相反的方式,相应的代码应该是
album.Artists.Add(艺术家1);专辑.Artists.Add(艺人2);context.Albums.Add(相册)我想最终这都是一个实现的问题。我认为EF的change tracker本可以变得足够智能,能够从
专辑
的结尾(在您的第一个代码片段中)检测到添加的关系,但事实并非如此。这些多对多关系是。史蒂夫,谢谢你的解释。我想我会去的。在第二种情况下,因为我按唱片集“开始保存”,所以当EF查看列表时,它没有看到任何艺术家停止。