Sto creando un'API Web utilizzando ASP.net MVC core con Entity Framework Core. sto usando NSwag per usare la documentazione di Swagger e l'interfaccia utente di Swagger, lì sto testando i metodi Post e funzionano, ma i get restituiscono vuoti o nulli.
qui puoi vedere i dati nel database
il codice per ottenere tutti i dati di una tabella è questo:
// GET: api/UserRoles
[HttpGet]
public IEnumerable<UserRole> GetUserRoles()
{
return _context.UserRoles.ToList();
}
ma restituisce null anche quando sono presenti dati nel database e tutte le altre query restituiscono null o vuote (o generano un'eccezione nel caso di .First()
questo è il mio OnModelCreating
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
//Debugger.Launch();
modelBuilder.Entity<Category>().HasOne(x => x.ParentCategory).WithMany(x => x.SubCategories).HasForeignKey(x => x.ParentCategoryId);
foreach (var entity in modelBuilder.Model.GetEntityTypes())
{
var type = entity.ClrType.GetInterface(nameof(Interfaces.IDto));
if (type == null) continue;
modelBuilder.Entity(entity.ClrType).Property<DateTime?>("DeletedAt");
modelBuilder.Entity(entity.ClrType)
.Property<DateTime>("LastUpdated")
.HasComputedColumnSql("SYSUTCDATETIME()");
modelBuilder.Entity(entity.ClrType)
.Property<DateTime>("CreatedAt").HasDefaultValueSql("SYSUTCDATETIME()"); ;
modelBuilder.Entity(entity.ClrType)
.HasKey(nameof(Interfaces.IDto.Id)).ForSqlServerIsClustered(false);
modelBuilder.Entity(entity.ClrType)
.HasIndex("CreatedAt").ForSqlServerIsClustered();
var parameter = Expression.Parameter(entity.ClrType, "e");
var body = Expression.NotEqual(
Expression.Call(typeof(EF), nameof(EF.Property), new[] { typeof(DateTime?) }, parameter, Expression.Constant("DeletedAt")),
Expression.Constant(null));
modelBuilder.Entity(entity.ClrType).HasQueryFilter(Expression.Lambda(body, parameter));
}
modelBuilder.Entity<Customer>().HasIndex(x => x.Identification).IsUnique();
}
questo è il mio modello UserRole
public class UserRole:Dbo
{
public string Name { set; get; }
public string Description { get; set; }
}
questa è la mia classe Dbo
public abstract class Dto : IDto, INotifyPropertyChanged
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid Id { get; set; }
public event PropertyChangedEventHandler PropertyChanged;
[NotifyPropertyChangedInvocator]
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
tutte le query restituiscono null o vuote per tutti i modelli
Aggiornare:
qui puoi vedere un metodo Where()
chiamato con 0 risultati (ho solo un record con il name
uguale a "admin"), puoi anche vedere che interrogare la tabella StockMovementFlow
viene interrogato e restituire anche 0 record.
Il problema è Expression.NotEqual
qui:
var parameter = Expression.Parameter(entity.ClrType, "e");
var body = Expression.NotEqual(
Expression.Call(typeof(EF), nameof(EF.Property), new[] { typeof(DateTime?) }, parameter, Expression.Constant("DeletedAt")),
Expression.Constant(null));
modelBuilder.Entity(entity.ClrType).HasQueryFilter(Expression.Lambda(body, parameter));
Ciò che attualmente fa è impostare un filtro di query globale (ovvero condizione aggiuntiva applicata a tutte le query) simile a questo (pseudo codice):
e => e.DeletedAt != null
che restituirebbe tutti i record eliminati soft (che nel tuo caso non sono nessuno), mentre immagino che l'idea fosse quella di restituire record non eliminati soft, cioè
e => e.DeletedAt == null
Quindi cambia semplicemente Expression.NotEqual
in Expression.Equal
e il problema sarà risolto.
È necessario creare una query per ottenere informazioni specifiche dal proprio contesto.
crea la query sulla tua tabella usando il contesto.
Per esempio.
var query = context.Students
.where(s => s.StudentName == "Bill")
.FirstOrDefault<Student>();
query.tolist ()