Они делают то же самое.Реальный вопрос в том, когда вы будете использовать один над другим.
Вы используете DbSet, когда знаете тип сущности, с которой хотите играть.Вы просто пишете имя DbContext, а затем имя типа объекта, и вы можете создавать, читать, обновлять или удалять записи для этого объекта с помощью доступных методов объекта.Вы знаете, чего хотите, и знаете, где это сделать.
Вы используете Set, когда не знаете тип сущности, с которой хотите играть.Допустим, вы хотели создать класс, который выполняет функции вашего хранилища для создания, чтения, обновления и удаления записей для сущности.Вы хотите, чтобы этот класс можно было повторно использовать, чтобы вы могли просто передать ему DbContext, и он будет использовать те же методы создания, чтения, обновления и удаления.Вы не знаете наверняка, на каком DbContext он будет использоваться или какой DbSet будет у DbContext.Вот когда вы используете дженерики, чтобы ваш класс мог использоваться любым DbContext для любого DbSet.
Вот пример класса, который вы можете использовать для создания любого объекта в любом DbSet в любом DbContext
public class Repository<TDbContext> where TDbContext : DbContext
{
private TDbContext _context { get; }
public Repository(TDbContext context)
{
_context = context;
}
public TEntity Create<TEntity>(TEntity entity) where TEntity : class
{
if(entity != null)
{
var dataSet = _context.Set<TEntity>();
if(entity is IEnumerable)
{
dataSet.AddRange(entity);
}
else
{
dataSet.Add(entity);
}
_context.SaveChanges();
}
return entity;
}
}
А вот как это использовать.
var dbContext01 = new DbContext01();
var dbContext02 = new DbContext02();
var repository01 = new Repository<DbContext01>(dbContext01);
var repository02 = new Repository<DbContext02>(dbContext02);
repository01.Create(new EntityOnDbContext01 {
Property01A = "String",
Property01B = "String"
});
repository02.Create(new EntityOnDbContext02 {
Property02A = 12345,
Property02B = 12345
});
Вот ссылка, если вы хотите узнать больше о дженериках.Это супер круто.
https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/generics/