class MyContext : DbContext
{
public DbSet<Post> Posts { get; set; }
public DbSet<Tag> Tags { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<PostTag>()
.HasKey(t => new { t.PostId, t.TagId });
modelBuilder.Entity<PostTag>()
.HasOne(pt => pt.Post)
.WithMany(p => p.PostTags)
.HasForeignKey(pt => pt.PostId);
modelBuilder.Entity<PostTag>()
.HasOne(pt => pt.Tag)
.WithMany(t => t.PostTags)
.HasForeignKey(pt => pt.TagId);
}
}
public class Post
{
public int PostId { get; set; }
public string Title { get; set; }
public string Content { get; set; }
public List<PostTag> PostTags { get; set; }
}
public class Tag
{
public string TagId { get; set; }
public List<PostTag> PostTags { get; set; }
}
public class PostTag
{
public int PostId { get; set; }
public Post Post { get; set; }
public string TagId { get; set; }
public Tag Tag { get; set; }
}
public abstract class BaseRepository<TEntity>
where TEntity : class
{
protected readonly MyDbContext _context;
protected DbSet<TEntity> Set => _context.Set<TEntity>();
public BaseRepository(MyDbContext context)
{
_context = context;
}
public IQueryable<TEntity> GetAll()
{
return Set.AsQueryable();
}
public TEntity GetById(int id)
{
return Set.Find(id);
}
public void Commit() => _context.SaveChanges();
}
GetAll()
и в наследниках делать .Include()
к соответствующим зависимостям, но даже при этом ужасе мы натыкаемся на коллекцию (соединительной таблицы) и хз, что делать с этим. В гайдах либо отсылки к EF7 (где проблемы нет как таковой), либо никакой абстракции над DbContext
не используется, поэтому Include невозбранно делаются перед самим запросом. BaseRepository.Set { get; }
, чтобы переопределять (и доинклуживать зависимости) необходимо было только в него._context.Posts.Include(p => p.PostTags)
.ThenInclude(pt => pt.Tag);