猿问

对数据库的查询返回空或 null 但保存数据确实有效

我正在使用带有 Entity Framework Core 的 ASP.net MVC 核心创建一个 Web API。我正在使用 NSwag 来使用 swagger 文档和 Swagger UI,我正在测试 Post 方法并且它们有效,但 get 返回空或 null。

在这里可以看到数据库中的数据

获取表的所有数据的代码是这样的:


 // GET: api/UserRoles

        [HttpGet]

        public IEnumerable<UserRole> GetUserRoles()

        {

            return _context.UserRoles.ToList();

        }

但即使数据库中有数据,它也返回 null,并且所有其他查询返回 null 或空(或在以下情况下抛出异常.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();

    }


翻阅古今
浏览 190回答 2
2回答

幕布斯6054654

问题在Expression.NotEqual这里:var parameter = Expression.Parameter(entity.ClrType, "e");var body = Expression.NotEqual(&nbsp; &nbsp; Expression.Call(typeof(EF), nameof(EF.Property), new[] { typeof(DateTime?) }, parameter, Expression.Constant("DeletedAt")),&nbsp; &nbsp; Expression.Constant(null));modelBuilder.Entity(entity.ClrType).HasQueryFilter(Expression.Lambda(body, parameter));当前所做的是设置一个类似于此(伪代码)的全局查询过滤器(即应用于所有查询的附加条件):e => e.DeletedAt != null这将返回所有软删除记录(在你的情况下没有),而我想这个想法是返回非软删除记录,即e => e.DeletedAt == null所以只需更改Expression.NotEqual为Expression.Equal,问题就会得到解决。

慕码人2483693

您需要创建一个查询以从您的上下文中获取特定信息。使用上下文创建对表的查询。例如。var&nbsp;query&nbsp;=&nbsp;context.Students &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.where(s&nbsp;=>&nbsp;s.StudentName&nbsp;==&nbsp;"Bill") &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.FirstOrDefault<Student>();查询.tolist()
随时随地看视频慕课网APP
我要回答