using System.Collections.Generic;
using Microsoft.EntityFrameworkCore;
public interface IStorageCollection<T> : IReadOnlyCollection<T>
internal sealed class StorageCollection<T> : HashSet<T>, IStorageCollection<T>
public void Delete(T item) { Remove(item); }
public int Id { get; set; }
public string Name { get; set; }
public int GroupId { get; set; }
public Group Group { get; protected set; }
private readonly StorageCollection<User> _users = new StorageCollection<User>();
public int Id { get; set; }
public IStorageCollection<User> Users => _users;
public void AddUser(User user) => _users.Add(user);
public class AppDbContext : DbContext
public AppDbContext(DbContextOptions<AppDbContext> options) : base(options) {}
public DbSet<Group> Groups { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
modelBuilder.Entity<User>()
.WithMany(g => g.Users).HasForeignKey(u => u.GroupId);
public static void Main()
var options = new DbContextOptionsBuilder<AppDbContext>().UseSqlite("DataSource=test.db").Options;
using (var context = new AppDbContext(options))
context.Database.EnsureCreated();
var group1 = new Group() { Id = 1 };
group1.AddUser(new User() { Id = 1, Name = "Alice" });
group1.AddUser(new User() { Id = 2, Name = "Bob" });
group1.AddUser(new User() { Id = 3, Name = "Connor" });
var group2 = new Group() { Id = 2 };
group2.AddUser(new User() { Id = 4, Name = "Eve" });
context.Groups.Add(group1);
context.Groups.Add(group2);
var result = context.SaveChanges();
Console.WriteLine($"saved: {result}");
using (var context = new AppDbContext(options))
var query = context.Groups.SelectMany(g => g.Users);
query.ToList().ForEach(u => Console.WriteLine($"{u.GroupId} {u.Id} {u.Name}"));
using (var context = new AppDbContext(options))
var connor = context.Groups.SelectMany(g => g.Users).Include(u => u.Group).Single(u => u.Id == 3);
connor.Group.Users.Delete(connor);
Console.WriteLine("===");
using (var context = new AppDbContext(options))
var query = context.Groups.SelectMany(g => g.Users).Include(u => u.Group);
query.ToList().ForEach(u => Console.WriteLine($"{u.Group.Id} {u.Id} {u.Name}"));