So, I have the following 3 classes:
User.cs
public class User
{
public int Id { get; set; }
public string Username { get; set; }
public string Email { get; set; }
public string Password { get; set; }
public virtual Timezone Timezone { get; set; }
public virtual ICollection<UserChannel> UserChannels { get; set; }
}
Channel.cs
public class Channel
{
public int Id { get; set; }
[Column("Channel")]
public string Name { get; set; }
}
UserChannel.cs
public class UserChannel
{
public int Id { get; set; }
public virtual User User { get; set; }
public virtual Channel Channel { get; set; }
}
UserChannel
is the medium between User
and Channel
.
The UserChannels
table looks like this:
+----+--------+-----------+
| Id | UserId | ChannelId |
+----+--------+-----------+
Both UserId
and ChannelId
are foreign keys, for the User
and Channel
class.
Now, to get which Channels
belong to a user, I would have to write something like this:
using var context = new TwitchContext();
var me = context.Users.FirstOrDefault(x => x.Id == 1);
var myChannels = me.UserChannels.Select(x => x.Channel);
Is there a way I can just get a collection of Channel
directly instead of using UserChannel
?
Many to many relationship without referencing the join table / entity won't be available until EF Core 5 comes out, as per current roadmap:
Feature request is tracked by this issue:
https://github.com/dotnet/efcore/issues/19003
that is included in EF Core 5.0.0 milestone.
EF Core 5 release is planned for November 2020.
In EF.Core, many-to-many without a join table is not yet supported . So you will need to rely on the solution with the UserChannel
class and the Select
call for now.
As your example does not explicitly specify that a channel can have multiple users, a one-to-many solution with a ICollection<Channel>
property might work as well.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.