Запросы к базе данных возвращают пустое или нулевое, но сохранение данных работает - PullRequest
2 голосов
/ 31 марта 2019

Я создаю веб-API, используя ядро ​​ASP.net MVC с Entity Framework Core.Я использую NSwag для использования документации Swagger и Swagger UI, там я тестирую методы Post, и они работают, но get возвращает пустое или нулевое значение.

здесь вы можете увидеть данные в базе данных

enter image description here

код для получения всех данных таблицы:

 // GET: api/UserRoles
        [HttpGet]
        public IEnumerable<UserRole> GetUserRoles()
        {
            return _context.UserRoles.ToList();
        }

, но он возвращает ноль, даже если есть данныев базе данных, и все остальные запросы возвращают ноль или пусто (или выдают исключение в случае .First()

это мой 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();
    }

это мой UserRole модель

public class UserRole:Dbo
{
    public string Name { set; get; }
    public string Description { get; set; }
}

это мой 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));
    }
}

все запросы возвращают нулевое или пустое значение для всех моделей

Обновление:

здесь вы можете увидеть Where() метод, вызываемый с 0 результатами (у меня есть только одна запись с name, равным «admin»), также вы можете видеть, что запрос к таблице StockMovementFlow запрашивается и возвращает 0 записейтоже.

enter image description here

Ответы [ 2 ]

4 голосов
/ 31 марта 2019

Проблема здесь Expression.NotEqual:

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));

В настоящий момент необходимо установить глобальный фильтр запросов (то есть дополнительное условие, примененное к всем запросов) аналогично этому (псевдокод):

e => e.DeletedAt != null

, который будет возвращать все мягкие удаленные записи (которых в вашем случае нет), в то время как я предполагаю, что идея заключалась в том, чтобы возвращать не мягкие удаленные записи, то есть

e => e.DeletedAt == null

Так что просто измените Expression.NotEqual на Expression.Equal, и проблема будет решена.

0 голосов
/ 31 марта 2019

Вам необходимо создать запрос для получения конкретной информации из вашего контекста.

создайте запрос к вашей таблице, используя контекст.

Например.

var query = context.Students
                   .where(s => s.StudentName == "Bill")
                   .FirstOrDefault<Student>();

query.tolist ()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...