请考虑以下3个实体A
,B
和C
。 A
对C
是多对多关系。 B
到A
是一对多关系(B
有很多A
,这意味着B
到C
也是多对多)。
如果这些过于复杂的关系对您来说似乎太含糊,请考虑以下示例:
Track
(A
)有多个Artist
(C
),一个Artist
有多个Track
s(许多-很多)Album
(B
)有多个Track
。 (一对多,Track
不能属于多个Album
s)这样(表示):
Album
有多个Artist
,而Artist
有多个Album
(多对多)问题:如何使实体具有这种关系?通过以下代码,我建立了Album
至Artist
,Track
-到-Artist
。 如何创建Artist
-Album
关系,因为它似乎需要连接4个表/实体。
public class Context: DbContext
{
// irrelevant code omitted...
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<TracksToArtists>()
.HasKey(r => new {r.TrackId, r.ArtistId});
modelBuilder.Entity<TracksToArtists>()
.HasOne(r => r.Track)
.WithMany(t => t.Artists)
.HasForeignKey(r => r.TrackId);
modelBuilder.Entity<TracksToArtists>()
.HasOne(r => r.Artist)
.WithMany(a => a.Tracks)
.HasForeignKey(r => r.ArtistId);
}
}
public class Track
{
public Guid Id { get; set; }
public string Name { get; set; }
public Guid AlbumId { get; set; }
public Album Album { get; set; }
public List<TracksToArtists> Artists { get; set; }
}
public class Album
{
public Guid Id { get; set; }
public string Name { get; set; }
public List<Track> Tracks { get; set; }
// TODO: create album-to-artist many-to-many relationship
// public List<SomethingArtistMaybe?> Artists { get; set; }
}
public class Artist
{
public Guid Id { get; set; }
public string Name { get; set; }
public List<TracksToArtists> Tracks { get; set; }
// TODO: create album-to-artist many-to-many relationship
// public List<SomethingAlbumMaybe?> Albums { get; set; }
}
// many-to-many relationship
public class TracksToArtists
{
public Guid TrackId { get; set; }
public Track Track { get; set; }
public Guid ArtistId { get; set; }
public Artist Artist { get; set; }
}
如果仅使用原始SQL查询,这非常简单,但是使用ORM,一切都会变得有些痛苦。
最佳,我想避免引入AlbumToArtist
表,因为它可能会导致数据不一致。应该是这样的:
答案 0 :(得分:0)
如果我对您的理解正确,那么Artist
与Album
没有直接关系,这种关系只能通过Track
来实现。
考虑将Album
放在中间,这样每个Artist
都有多个Album
,反之亦然(多对多),然后让Album
导航到Track
个(一对多)。
无论如何,无论您是选择保留模型还是按照我的建议,从点到另一点(在您的问题中,每个Album
的{{1}}个)访问图形,都使用{{ 3}}:
Artist
您还可以启用eager loading,这样就不必在查询中明确包含导航属性,但是这样做会降低性能。