为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
翻阅古今 2022-11-21 15:49:56
我正在使用带有 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()这是我的OnModelCreatingprotected 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();    }
查看完整描述

2 回答

?
幕布斯6054654

TA贡献1876条经验 获得超7个赞

问题在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,问题就会得到解决。


查看完整回答
反对 回复 2022-11-21
?
慕码人2483693

TA贡献1860条经验 获得超9个赞

您需要创建一个查询以从您的上下文中获取特定信息。

使用上下文创建对表的查询。

例如。

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

查询.tolist()


查看完整回答
反对 回复 2022-11-21
  • 2 回答
  • 0 关注
  • 94 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信