实体框架 - 多对多

时间:2018-06-18 20:18:23

标签: entity-framework

我无法理解EF。

我有2对N-N关系表。当我在Visual Studio中创建模型时,我会得到如下图所示。

艺术家与专辑有关,专辑与艺术家有关。 在数据库中,我有一个表来关联两个表。

我的问题是:

enter image description here

为什么我可以为艺术家添加两张专辑

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。

感谢阅读。 FranciscoRC

1 个答案:

答案 0 :(得分:1)

扩展伊万的评论。

通过这个例子:

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必须继续使用你在专辑中设置的内容。

在您的情况下,您创建了2个艺术家对象和1个专辑。您已将相册与艺术家相关联,但您只是通知EF要保存相册。就像POCO一样,因为艺术家有专辑而专辑有艺术家,所以在艺术家上设置专辑并不会自动在专辑中设置艺术家属性。 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将为null,因为您尚未设置任何内容。在SaveChanges之后,artist1& 2 .Album将引用您的新实体,因为EF解析了专辑中的Artists系列并连接了相关参考。 (尽管艺术家1和2没有明确地添加到上下文中。)